Как переопределить метод класса драгоценного камня в Rails Application? - PullRequest
16 голосов
/ 22 апреля 2010

Лучшая практика для переопределения метода класса драгоценного камня в рельсах , Мне нужно переопределить поведение метода find для гема.

следующий код в драгоценном камне

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

Как переопределить вышеуказанный метод поиска в моем приложении YoutubeSearch Controller of Rails?

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

Ответы [ 2 ]

32 голосов
/ 22 апреля 2010

Создайте файл .rb в каталоге config/initializers со следующим кодом:

Youtube::display.class_eval do
   def find(id, options = {})
    //Code here     
   end
end
0 голосов
/ 23 ноября 2016

Я разработал такое решение, которое НЕ требует перезапуска сервера 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
...