首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证对条款的接受:如果validate_acceptance_of为零,则terms_accepted成功

验证对条款的接受:如果validate_acceptance_of为零,则terms_accepted成功
EN

Stack Overflow用户
提问于 2012-05-03 00:11:40
回答 1查看 2.8K关注 0票数 1

在创建用户时,我正在检查使用条件是否被接受如下:

代码语言:javascript
复制
# 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

我的表单视图中有以下字段:

代码语言:javascript
复制
<label class="checkbox"><%= f.check_box :terms %><span><%=t "users.form.label.terms" %></span></label>

到目前为止,一切都如期而至。如果用户不接受这些条款,就会出现错误消息。但是,如果我使用例如Chrome工具从页面中删除复选框(以及视图助手生成的相应隐藏字段),用户将被创建!

我可以在控制台中再现这一点:

代码语言:javascript
复制
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,还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-03 00:56:33

如果要确保用户接受条款,则可以将allow_nil设置为false

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

代码语言:javascript
复制
:allow_nil - Skip validation if attribute is nil (default is true).

所以改变到

代码语言:javascript
复制
validates_acceptance_of :terms, :on => :create, :allow_nil => false, :message => :terms_not_accepted,
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10423464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档