Rails 如何取消 model 里对某个字段的验证

martin91 · 2013年06月27日 · 最后由 Martin91 回复于 2013年06月27日 · 4140 次阅读

项目里使用了 Spree,其中的 Address 里有这样一个验证:

validates :firstname, :lastname, :address1, :city, :zipcode, :country, :presence => true

但是业务需求是:zipcode是可选的,所以需要取消对:zipcode的 presence 验证。

目前的解决方法如下:

# Delete presence validation on :zipcode
validators.select{|v| v.kind_of?(ActiveModel::Validations::PresenceValidator)}.each do |validator|
  validator.attributes.delete :zipcode
end

本人新手,所以不知道有没有现成的方法可以更好地解决这个问题。另外我总觉得上面的代码不是很让人放心啊,不知哪位前辈能够分享一下经验?先谢过了!

能不能直接 删掉 :zipcode

我看最新版 spree 代码提供了个 require_zipcode? 的方法可以覆盖。

我记得 validate 后面可以加 if 选项吧,应该可以在 if 里面判断一下 是否需要验证,具体的你查一下 api

#2 楼 @Rei 这应该是正解!

#1 楼 @zhulinpinyu 不行的,因为只是希望让其变为可选,并不是要让它从 model 里边去掉。

#2 楼 @Rei 谢谢你的提示,我刚看到最新的源码了,在 2.1.0.beta 版本里确实有这样的方法,而 2.0.0 里边没有。只不过我现在用的版本是 1.3.2,因为项目正急,所以不敢轻易升级,怕带来额外的麻烦。所以有没有方法在不升级的前提下解决这个问题?

#3 楼 @TsingHan 嗯,validates方法可以加:if进行判断,但是之前的 validate 是写在 gem 包里的,难道我可以直接在我的代码里边重新写一下:

validates :zipcode, :presence => true, :if => :require_zipcode?

以覆盖之前的 validate?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号