在创建用户时,我正在检查使用条件是否被接受如下:
# 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工具从页面中删除复选框(以及视图助手生成的相应隐藏字段),用户将被创建!
我可以在控制台中再现这一点:
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会产生同样的结果
我知道我可以在一个false回调中用after_initialize初始化terms属性,但是我不想这样做,因为验证器应该能够处理nil的情况。那么,,这是rails中的一个bug,还是我做错了什么?
发布于 2012-05-03 00:56:33
如果要确保用户接受条款,则可以将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,https://stackoverflow.com/questions/10423464
复制相似问题