如何从 Rails 中的 gem 覆盖类的方法?
Posted
技术标签:
【中文标题】如何从 Rails 中的 gem 覆盖类的方法?【英文标题】:How to override a method of a class from a gem in Rails? 【发布时间】:2011-02-10 22:39:18 【问题描述】:我需要从 gem 中重写类的 find
方法的行为。
这是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
如何在我自己的 Rails 应用程序的 YoutubeSearch 控制器中覆盖上述 find
方法?
def find(id, options = )
//Code here
end
【问题讨论】:
【参考方案1】:在config/initializers
目录下创建一个.rb文件,代码如下:
Youtube::Display.class_eval do
def find(id, options = )
# Code here
end
end
【讨论】:
这不就是和class Youtube::Display ... end
一样吗?【参考方案2】:
我已经详细阐述了这样一个解决方案,它不需要在每次代码更改后都需要重启 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
【讨论】:
想详细说明一下吗? 还有什么? 是的,这种方法无效——但我还没有找到更好的方法。将此代码放入初始化程序(就像每个人一样)会更糟(这意味着在每次代码更改时重新启动服务器)。以上是关于如何从 Rails 中的 gem 覆盖类的方法?的主要内容,如果未能解决你的问题,请参考以下文章
使用 bootstrap-sass gem 覆盖 Rails 中的 Bootstrap 变量