ユーザーを作成するとき、使用条件が次のように受け入れられたかどうかを確認しています。
# 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>
これまでのところ、すべてが期待どおりに機能します。ユーザーが利用規約に同意しない場合は、エラーメッセージが表示されます。ただし、Chrome開発者ツールなどを使用してHTMLページからチェックボックス(およびビューヘルパーによって生成された対応する非表示フィールド)を削除すると、ユーザーが作成されます。
これをコンソールで再現できます。
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
もう1つの情報:validates :terms, :acceptance => true
同じ結果が得られます
false
コールバックでterms属性を初期化できることは知っていafter_initialize
ますが、バリデーターがケースを処理できるはずなので、そうはしたくありませんnil
。それで、これはRailsのバグですか、それとも私は何か間違ったことをしていますか?