Ruby on rails 为单独文件(RoR)中的模型类添加回调

Ruby on rails 为单独文件(RoR)中的模型类添加回调,ruby-on-rails,activerecord,initialization,callback,Ruby On Rails,Activerecord,Initialization,Callback,我有一个消息模型类(继承自ActiveRecord::Base)。对于特定的部署,我希望有一个单独的文件,通过添加回调来修改消息。因此,与其这样做,不如: # app/models/message.rb class Message < ActiveRecord::Base before_save :foo def foo puts 'foo!' end end #app/models/message.rb 类消息

我有一个消息模型类(继承自ActiveRecord::Base)。对于特定的部署,我希望有一个单独的文件,通过添加回调来修改消息。因此,与其这样做,不如:

# app/models/message.rb
class Message < ActiveRecord::Base
  before_save :foo
  def foo
     puts 'foo!'
  end
end
#app/models/message.rb
类消息
我希望能够做到:

# app/models/message.rb
class Message < ActiveRecord::Base
end

# config/initializers/fixes.rb
Message
class Message
  before_save :foo
  def foo
     puts 'foo!'
  end
end
#app/models/message.rb
类消息
问题是,当我启动脚本/控制台时,它可以工作,但当我使用脚本/服务器启动它时,它通常不会工作。这是最糟糕的部分,并不是说它永远不起作用。有时我启动服务器,它工作正常,有时不工作,也就是说,没有对源代码进行任何更改

我正在重新启动服务器本身,因为(据我所知)初始化器只运行一次,如果修改,不会重新加载


我知道“有时”的工作是非常模糊的,但我在这里度过了几个小时,没有任何运气。可能有人遇到过类似的问题,或者可以想出不同的想法来添加回调。

为什么不将它们放到模块中并导入它

class Message < ActiveRecord::Base
  include Message::Callbacks
end

这样做的缺点是要做更多的工作来保护这些方法。

为什么不把它们放到一个模块中并导入呢

class Message < ActiveRecord::Base
  include Message::Callbacks
end
这样做的缺点是需要更多的工作来保护这些方法。

为什么不使用观察者?()

例如,您可以这样做:

class MessageObserver < ActiveRecord::Observer
  def before_save(message)
    puts 'you win at ruby!'
  end
end
class MessageObserver
为什么不使用观察者?()

例如,您可以这样做:

class MessageObserver < ActiveRecord::Observer
  def before_save(message)
    puts 'you win at ruby!'
  end
end
class MessageObserver
这是一个选项,但我希望原始文件(message.rb)尽可能保持不变,因此添加此修复程序与添加单个文件一样简单,无需修改任何内容。这是一个选项,但我希望原始文件(message.rb)尽可能保持不变,因此添加此修复程序与添加单个文件一样简单,不需要修改任何东西。我不知道为什么我一直试图“黑客”rails,如果总是有一些内置的东西来做我需要做的事情。谢谢!不过,您可能需要让您的控制器知道正在使用的观察器,所以一定要进行彻底的测试。观察器不再是Rails核心的一部分:我不知道为什么我一直试图“破解”Rails,如果总是有一些内置的东西来做我需要做的事情。谢谢!不过,您可能需要让控制器知道正在使用的观察器,因此请确保进行彻底测试。观察器不再是Rails核心的一部分: