2010-04-22 30 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