Railsフォーム検証の条件付きバイパス
-
05-07-2019 - |
質問
2つのフォーム値の一意性を検証するRailsモデルがあります。これら2つの値が一意でない場合、検証エラーが表示され、<!> quot; submit <!> quot;ボタンが<!> quot; resubmit <!> quot;に変更されます。ユーザーが<!> quot; resubmit <!> quotをクリックできるようにします。ボタンをクリックし、モデル検証をバイパスします。 Rails検証ドキュメントから次のようなことをしたい:
validates_uniqueness_of :value, :unless => Proc.new { |user| user.signup_step <= 2 }
しかし、チェックできる値はモデルにありません... <!> quot; Resubmit <!> quot;を持つパラメータだけです。値。
これを行う方法についてのアイデアはありますか?
解決
私の意見では、これが最善の方法です:
class FooBar < ActiveRecord::Base
validates_uniqueness_of :foo, :bar, :unless => :force_submit
attr_accessor :force_submit
end
ビューで、submitタグに次のような名前を付けてください
<%= submit_tag 'Resubmit', :name => 'foo_bar[force_submit]' %>
この方法では、すべてのロジックはモデル内にあり、コントローラーコードは同じままです。
他のヒント
これを試してください:
レール2:Model.save(false)
Rails 3:Model.save(:validate => false)
検証をバイパスします(ただし、すべて検証します)。
これについては肯定的ではありませんが、フォームが以前に1回送信されたかどうかを保持するために、attr_accessorをモデルに追加しようとすることができます。
追加するだけ
attr_accessor :submitted
モデルに追加し、検証で確認します。
送信ボタンを見るだけで、検証を実行するかどうかを判断できます。
def form_method
case params[:submit]
when "Submit"
'Do your validation here'
when "Resubmit"
'Do not call validation routine'
end
end