8

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')を使用すると、そこで正常に機能します...しかし、その場合、コントローラーはどのようにしてバリデーターに情報を「渡す」ことができますかフィールドを検証する必要があるかどうかを通知します。

4

1 に答える 1

12

それがモデルロジックです。カスタム検証を見てください

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

その後、他の検証と同じように機能します。

編集

:if次のオプションを使用して、条件付きで検証できます。

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

そしてあなたのコントローラーで:

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
于 2012-10-02T03:43:28.280 に答える