2010-04-22 33 views
14

覆蓋rails應用程序中gem的類方法的最佳實踐? 。我需要重寫gem的find方法的行爲。如何覆蓋rails應用程序中gem的類方法?

以下是在創業板

module Youtube 
    class display 
    attr_accessor :base 
     def find(id, options = {}) 
     detailed = convert_to_number(options.delete(:detailed)) 
     options[:detailed] = detailed unless detailed.nil? 
     base.send :get, "/get_youtube", options.merge(:youtube_id => id) 
    end 
    end 
end 

我如何覆蓋上面find方法在Rails應用程序的我YoutubeSearch控制器的代碼?

def find(id, options = {}) 
    //Code here  
    end 

回答

26

創建config/initializers目錄中的文件名爲.rb用下面的代碼:

Youtube::display.class_eval do 
    def find(id, options = {}) 
    //Code here  
    end 
end 
+0

感謝您的回覆,當我想你的代碼時,我開始一個雜種實例'load_missing_constant「我去這個錯誤:未初始化不斷的Youtube(NameError) – 2010-04-22 08:05:00

+0

這很奇怪,因爲初始化器在加載所有插件和寶石後執行。你確定那裏沒有錯別字嗎(比如YouTube)?如果沒有,請嘗試在初始化程序開始處用'Youtube :: display'類來請求文件。 – 2010-04-22 08:30:33

+0

要求失蹤,還有錯字錯誤,初始化程序在加載所有gem之前加載謝謝 – 2010-04-22 09:09:25

-2

我已經制定了這DOES NOT需要每次代碼更改後Rails服務器重啓這樣的解決方案(與所有其他的解決方案):

1. 創建YoutubeHelper.rb

module YoutubeHelper 

    include Youtube 

    def init_youtube_helper 

    display.class_eval do 
     def find(id, options = {}) 
     //Code here  
     end 
    end 

    end 

end 

2. youtube_search_controller.rb

class YoutubeSearchController < ActionController::Base 
    include YoutubeHelper  
    before_action :init_youtube_helper 
end 
+0

小心詳細一點? – RamenChef 2016-11-23 14:43:25

+0

究竟更多? – prograils 2016-11-24 07:46:03

+0

是的,這種方法並不有效 - 但我還沒有找到更好的方法。將這些代碼放入初始化程序中(就像所有人一樣)會更糟糕(這意味着在每次更改代碼時重新啓動服務器)。 – prograils 2016-11-25 07:09:37