首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >before_validation,on::save vs before_save

before_validation,on::save vs before_save
EN

Stack Overflow用户
提问于 2013-04-30 17:24:30
回答 3查看 7.7K关注 0票数 2

假设我有一个模型,在保存它之前,我可能需要操作它的一些属性:

代码语言:javascript
复制
class User < ActiveRecord::Base

  attr_accessible :name, :email

  # before_validation :set_name_from_email, on: :save
  # OR
  # before_save :set_name_from_email

  def set_name_from_email
    self.name ||= email
  end

end

如果我必须使用validates :name, presence: true,那么这当然必须放在before_validation中。但是,如果回调不会影响对象的有效性(就像现在的代码一样),那么将它放在before_save中会更好吗

让你所有的数据在一个或者另一个存储桶中操作回调似乎更整洁,以防代码更改和回调现在可能会影响有效性,但话又说回来,在调用.valid?之类的东西时运行不必要的回调似乎不太好。

无论哪种方式,有什么强烈的意见吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-30 18:04:25

通常,我会将所有数据操作放在before_save中,因为将所有数据操作放在一个位置(在保存之前)是符合逻辑的。

但是,如果将来要对name字段进行验证(即使数据操作不会影响有效性),也应该将数据操作放在before_validation中,因为您不希望在验证数据x时将数据y存储在数据库中。

你可以在这里阅读更多信息:http://bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/

票数 8
EN

Stack Overflow用户

发布于 2013-04-30 17:58:06

因为您实际上并没有验证任何东西,而是在操作一个属性,所以您应该使用before_save回调。

自定义验证方法通常会向模型添加错误,而您的set_name_from_email不会这样做。

票数 3
EN

Stack Overflow用户

发布于 2013-04-30 18:00:07

除非您想要验证您自己的方法分配给“的值,否则您可以同时使用这两种方法。

但是,如果您的方法可能导致无效的名称,则应该使用before_validation。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16296448

复制
相关文章

相似问题

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