创建用户时,我正在检查使用条款是否被接受,如下所示:
# 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
另一个信息:validates :terms, :acceptance => true
产生相同的结果
我知道我可以false
在after_initialize
回调中初始化 terms 属性,但我不想这样做,因为验证器应该能够处理这种nil
情况。那么这是rails中的错误还是我做错了什么?