1

ユーザーを作成するとき、使用条件が次のように受け入れられたかどうかを確認しています。

# 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のバグですか、それとも私は何か間違ったことをしていますか?

4

1 に答える 1

5

ユーザーが条件に同意することを確認したい場合は、allow_nilをfalseに設定できます

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

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

だからに変更します

validates_acceptance_of :terms, :on => :create, :allow_nil => false, :message => :terms_not_accepted,
于 2012-05-03T00:56:33.170 に答える