2012-05-03 12 views
1

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のケースを処理できるはずなので、私はそれをしたくありません。だからこれはレールのバグですか、何か間違っているのですか?

答えて

5

ユーザーが用語を受け入れ、その後、あなたは偽

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000082

:allow_nil - Skip validation if attribute is nil (default is true). 

にallow_nilを設定できることを確認したい場合はそう

validates_acceptance_of :terms, :on => :create, :allow_nil => false, :message => :terms_not_accepted, 
+0

どうもありがとうに変更!私はこのオプションを知らなかった... – emrass

+0

確かに!ユーザーインターフェイスの外にユーザーを作成することができるようになっていますが、インターフェイスにいた場合は受け入れという用語が必要になります。 –

+1

はい、私はこのデフォルト設定の目的を理解しています。ちょっと残念ですが、HTMLからチェックボックスフラグを削除するだけで、条件に同意する必要なく、CURL POSTをユーザー作成に発行できます。私はそれが厄介な問題だとは思わないが、この実装を使用しているレールのウェブサイトの約95%が同じ問題を抱えていると想像することができます。 – emrass

関連する問題