ruby-on-rails - 是:on => :create valid for a before_save callback in Rails 3. 2.3

标签 ruby-on-rails activerecord ruby-on-rails-3.2 before-save

如您所知,before_save回调先于before_create回调执行。

因此,有人建议in最好使用before_save :method, :on => :create而不是before_create,以便相对于其他回调(例如自动保存回调)在适当的时间执行该回调方法。例如,参见this Pivotal Labs blog postthis StackOverflow answer

但是,据我所知,:on => :create选项无法在before_save回调上实现所需的效果。换句话说,无论是否保存,都会为每个保存执行回调。

不过,:on => :create选项对于before_validation回调确实有效。

有人可以确认:on => :create是否适用于before_save吗?它是否可以在以前的Rails版本中工作并且现在已损坏,或者前面提到的链接只是被误认为了?

假设:on => :create无效,可以接受以下内容,和/或有没有更好的方法?

before_save :callback_method, :if => :new_record?

谢谢你。

最佳答案

没错,:on回调没有before_save选项。
但是,我不明白,为什么要使用before_save而不是before_createbefore_create回调将在before_save之后立即调用。

当然,您可以使用before_save :callback_method, :if => :new_record?。但是我个人不喜欢这种解决方案-如果我需要在:if选项中添加条件怎么办?

如果有人在before_savebefore_create回调之间有依赖关系,我建议合并两个回调。例如(伪代码):

class MyModel < ActiveRecord::Base
  before_create :prepare_x
  before_save :do_something_with_x

  def prepare_x
    @x = 10
  end


  # will not work, because `prepare_x` called after `do_something_with_x`
  def do_something_with_x
    @a = 100 / @x
  end
end

# ||
# ||
# \/

class MyModel < ActiveRecord::Base

  before_save :do_something_with_x

  def do_something_with_x
    @x = 10 if new_record?
    @a = 100 / @x
  end
end

关于ruby-on-rails - 是:on => :create valid for a before_save callback in Rails 3. 2.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640221/

相关文章:

ruby-on-rails - 如何过滤 ActiveRecord 模型的 association_ids?

ruby-on-rails - ActiveRecord::Enum - PG::InvalidTextRepresentation:错误:整数输入语法无效:

ruby-on-rails - rescue_from::AbstractController::ActionNotFound无法正常工作

asset-pipeline - Ruby on Rails 3.2 编译 Assets 不起作用

ruby-on-rails - 在生产环境中运行 Rails 迁移

javascript - jQuery 自动完成 : Display certain objects differently?

ruby-on-rails - Rails 检查字段值是否是该字段的默认值

jquery - 在调试器中找不到 jquery

javascript - 未捕获的 TypeError : Masonry. init 不是函数

ruby-on-rails - 永久设置rails控制台堆栈回溯限制