質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top