2012-10-02 10 views
7

Ho un modulo con 3 campi ActiveRecord. Uno di questi campi ha una sorta di stupido, e requisiti di convalida STATE-DEPENDENT. (Ad esempio, convalido il campo solo se l'oggetto viene creato su un modulo di installazione guidata.)come può un controller impostare manualmente gli errori di convalida per un determinato campo

Nel mio gestore POST per creare l'oggetto, ho pensato di poter chiamare errors.add per inserire una condizione di errore speciale

@foo = Foo.new(params[:foo]) 
if goofy_conditions(params[:foo][:goofy_field]) 
    @foo.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
end 
respond_to do |format| 
    if @foo.save 
    ... 
    else 
    ... redirect back to form (with error fields hilited) 

Tuttavia, fare @ foo.errors.add() nel controller non sembra fare nulla ... non impedisce il save() se gli altri campi passano le convalide.

Un'alternativa è mettere un gestore di convalida personalizzato nel modello ... So che usare errors.add (: field, 'msg') funziona bene lì ... ma in tal caso come può il mio controller 'passare' informazioni al validatore che indicano se il campo deve essere convalidato o meno.

+1

mettere un attrbute nonpersisted sul modello, dire guidata, impostare come appropriato e quindi basta usarlo in validazione nrmal? –

risposta

12

Questa è la logica del modello. Guardate custom validations

class GoofyThing < ActiveRecord::Base 
    validate :goofy_attribute_is_goofy 

    def goofy_attribute_is_goofy 
    if goofy_conditions(self.goofy_field) 
     self.errors.add(:goofy_field, "doesn't meet the goofy conditions") 
    end 
    end 
end 

Poi comporterò come qualsiasi altro convalida.

Modifica

È condizionalmente possibile convalidare con l'opzione :if:

attr_accessible :via_wizard 
validate :goofy_attribute_is_goofy, :if => lambda { self.via_wizard } 

e nel controllore:

class WizardController < ApplicationController 
    before_filter :get_object, :set_wizard 

    #... 

    def get_object 
    @object = GoofyThing.find(params[:id]) 
    end 

    def set_wizard 
    @object.via_wizard = true 
    end 
end 
+0

ah! l'attr_accessible: via_wizard è ciò che mi mancava. Grazie mille! – jpwynn

Problemi correlati