2012-10-02 12 views
7

Mam formularz z 3 polami ActiveRecord. Jedno z tych pól ma nieco głupkowate i wymagające walidacji wymogi walidacji. (Na przykład sprawdzam tylko pole, jeśli obiekt jest tworzony w formularzu kreatora instalacji).w jaki sposób kontroler może ręcznie ustawić błędy sprawdzania poprawności dla określonego pola

W moim programie obsługi POST do utworzenia obiektu, pomyślałem, że mogę wywołać błędy.add, aby wstawić specjalny warunek błędu

@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) 

Jednak wykonanie polecenia @ foo.errors.add() w kontrolerze nie wydaje się wykonywać żadnych czynności ... nie zapobiega zapisywaniu(), jeśli inne pola pomyślnie sprawdzają poprawność.

Alternatywą jest umieszczenie niestandardowej procedury sprawdzania poprawności w modelu ... Wiem, że używanie błędów.add (: pole, 'msg') działa dobrze ... ale w takim przypadku jak mój kontroler może 'przejść' informacje do walidatora informujące o tym, czy pole musi zostać zatwierdzone.

+1

umieścić nonpersisted attrbute od modelu powiedzieć kreatora, ustaw w razie potrzeby, a następnie po prostu użyć go w walidacji nrmal? –

Odpowiedz

12

To jest logika modelu. Spójrz na 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 

Wtedy będziemy działać tak jak każdy inny walidacji.

Edit

Można warunkowo zatwierdź opcją :if:

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

w kontrolerze:

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! attr_accessible: via_wizard jest tym, czego mi brakowało. Dziękuję Ci bardzo! – jpwynn

Powiązane problemy