2012-10-02 11 views
7

3つのActiveRecordフィールドを持つフォームがあります。これらのフィールドの1つには、グーフィーやSTATE-DEPENDENT検証要件があります。 (たとえば、オブジェクトがセットアップウィザードのフォームで作成されている場合にのみフィールドを検証します)コントローラーはどのようにして特定のフィールドの検証エラーを手動で設定できますか

オブジェクトを作成するPOSTハンドラで、errors.addを呼び出して特別なエラー条件を挿入できると考えました

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

しかし、コントローラで@ foo.errors.add()を実行しても何も起こっていないようです...他のフィールドが検証をパスすると、save()を防ぐことができません。

代替案は、モデルにカスタム検証ハンドラを置くことです...私はerrors.add(:field、 'msg')フィールドを使って正しく動作しますが、 infoをバリデーターに渡して、フィールドの検証が必要かどうかを指示します。

+1

は、ウィザードを言って、モデルにセットをnonpersisted attrbuteを置きます必要に応じてnrmal検証に使用します。 –

答えて

12

これはモデルロジックです。見てください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 

他の検証と同様に動作します。

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

とあなたのコントローラで:あなたは条件付きで:ifオプションで検証することができ

編集

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

ああ! attr_accessible:via_wizardは私が見逃したものです。どうもありがとうございました! – jpwynn

関連する問題