【问题标题】:ActiveRecord callbacks disappearing after request to Rails server向 Rails 服务器发出请求后 ActiveRecord 回调消失
【发布时间】:2012-08-29 20:28:27
【问题描述】:

我们有一个 Rails 应用程序,其中 after_create 从初始化程序动态添加到 ActiveRecord 模型。

我们已经尝试了 instance_eval

Foo.instance_eval do
  send "after_create", lambda{|r| r.some_method}
end

和class_eval

Foo.class_eval do
  after_create lambda{|r| r.some_method}
end

在创建它们之后运行Foo.new._create_callbacks 时,它会返回两个回调。

向 Rails 服务器发出请求后,两个回调消失。

这个问题只发生在开发中。暂存和制作工作正常。

development.rb 中设置config.cache_classes = true 时,回调将持续存在并且不会消失。

我们已经在其他应用程序中复制了这段代码,它工作正常,所以可能是配置问题。

注意:我们正在使用带有 lvh.me

的子域
  • Rails 3.1.1
  • Ruby 1.9.2-p180

谢谢:)

【问题讨论】:

  • 有道理:由于在开发模式下重新加载类,回调链会在每个请求上重新创建
  • 但为什么在其他应用程序中运行良好?
  • 是的,在 Rails 3.1.1 和 1.9.x 中都有
  • 所有cache_classes 设置为false?
  • 是的,同样的development.rb :(

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这个问题似乎是一个类似的问题,关于开发模式下的猴子补丁,它有一个潜在的解决方案:

How to monkey-patch code that gets auto-loaded in Rails?

【讨论】:

    【解决方案2】:

    在开发模式下的 Rails 中,当有新请求进入时,所有模型都会重新加载。这很有用,因为您不必在每次更改某些内容时都重新启动服务器。但是,在 prod 中这不会发生,因为存在性能损失。这里的问题是初始化程序仅在 Rails 应用程序初始化期间运行。请问您为什么要在初始化程序中设置 after_create 而不是模型本身?

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多