nilでの使用の観点からは、そうのような受け入れられた場合、私がチェックしています:検証の受け入れ:terms_accepted場合validate_acceptance_ofが成功したユーザーを作成するとき
# user.rb
class User < ActiveRecord::Base
validates_acceptance_of :terms, :message => :terms_not_accepted, :on => :create
attr_accessible :terms, :on => :create # required because I completely disable mass-assignment in an initializer
end
は、私は私のフォームビューで、次のフィールドがあります。
<label class="checkbox"><%= f.check_box :terms %><span><%=t "users.form.label.terms" %></span></label>
これまでのところ、すべて正常に動作します。ユーザーが規約に同意しない場合は、エラーメッセージが表示されます。 ただし、HTMLページからチェックボックス(およびビューヘルパーによって生成された対応する非表示フィールド)を削除するだけで、たとえばChromeデベロッパーツールは、ユーザーが作成されます!
irb(main):001:0> u = User.new # => #<User ...>
irb(main):002:0> u.terms # => nil
irb(main):003:0> u.save! # => other validations fail, but terms check succeeds!
irb(main):004:0> u.terms = false # => false
irb(main):005:0> u.save! # => terms validation fails as expected
一つの詳細情報:私は、コンソールでこれを再現することができ
validates :terms, :acceptance => true
が同じ結果
を生み出す私は用語がafter_initialize
コールバックでfalse
と属性初期化できることを知っているが、バリデーターがnil
のケースを処理できるはずなので、私はそれをしたくありません。だからこれはレールのバグですか、何か間違っているのですか?
どうもありがとうに変更!私はこのオプションを知らなかった... – emrass
確かに!ユーザーインターフェイスの外にユーザーを作成することができるようになっていますが、インターフェイスにいた場合は受け入れという用語が必要になります。 –
はい、私はこのデフォルト設定の目的を理解しています。ちょっと残念ですが、HTMLからチェックボックスフラグを削除するだけで、条件に同意する必要なく、CURL POSTをユーザー作成に発行できます。私はそれが厄介な問題だとは思わないが、この実装を使用しているレールのウェブサイトの約95%が同じ問題を抱えていると想像することができます。 – emrass