如何从 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 变量

如何使用Rails中的Mobility gem以一种形式实现所有翻译? [关闭]

如何安全地更新 Rails 应用程序中的所有 gem

如何将 Rails 视图助手提取到 gem 中?

如何从rails中删除设计模型?

如何将导入的gem中的vue组件加载到rails中的lib目录?