2010-01-21 61 views
1

我有一個消息模型類(它繼承自ActiveRecord :: Base)。對於特定的部署,我希望有一個單獨的文件通過添加回調來修改消息。所以,與其這樣做的:在單獨的文件(RoR)中爲模型類添加回調

# app/models/message.rb 
class Message < ActiveRecord::Base 
    before_save :foo 
    def foo 
    puts 'foo!' 
    end 
end 

我希望能夠做到:

# 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 

問題是,當我啓動腳本/控制檯它的工作原理,但是當我開始使用腳本它/服務器它通常沒有。這是最糟糕的部分,但並不是它永遠不會起作用。有時候我會啓動服務器,它有效,有時不會,並且不會對源進行任何更改。

我重新啓動服務器本身(據我所知)初始化程序只運行一次,如果修改不重新加載。

我知道'有時'的作品非常含糊,但我在這裏度過了幾個小時,沒有任何運氣。也許有人有類似的問題,或者可以想出一個不同的想法來添加回調。

回答

2

爲什麼不使用觀察者? (http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

例如,你會做這樣的事情:

class MessageObserver < ActiveRecord::Observer 
    def before_save(message) 
    puts 'you win at ruby!' 
    end 
end 
+0

我不知道爲什麼我一直試圖「破解」的軌道,如果總是有一些內置做的正是我需要做的。非常感謝! – 2010-01-21 16:04:29

+0

樂意幫忙! =) – jonnii 2010-01-21 16:08:45

+0

您可能需要讓你的控制器瞭解所使用的觀察員,但是,所以一定要徹底地測試。 – tadman 2010-01-21 20:03:26

9

爲什麼不把它們放到模塊中並導入它?

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

在另一個文件中,您可以定義任何你喜歡的,如消息/ callbacks.rb:

module Message::Callbacks 
    def self.included(base) 
    base.class_eval do 
     before_save :foo 
    end 
    end 

    def foo 
    # ... 
    end 
end 

這樣做的缺點是它的更多的工作,以使受保護的方法。

+0

這是一種選擇,但我要離開原來的文件(message.rb)作爲不變的可能,所以加入此修復程序就像添加單個文件一樣簡單,而不需要修改任何內容。 – 2010-01-21 15:52:05

相關問題