2010-04-22 13 views
14

Best Practice zum Überschreiben einer Klassenmethode des Gem in Rails Application? . Ich muss das Verhalten der Finde-Methode eines Edelsteins überschreiben.Wie überschreiben Sie eine Klassenmethode des Edelsteins in Schienen? Anwendung?

folgenden wird der Code in der 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 

Wie ich die oben find-Methode in meinem YoutubeSearch Controller of Rails-Anwendung tun außer Kraft setzen?

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

Antwort

26

erstellen .rb Datei in config/initializers Verzeichnis mit dem folgenden Code:

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

Vielen Dank für Ihre Antwort, wenn ich den Code habe ich versucht, diesen Fehler zu gehen, wenn ich eine Mischlings Instanz 'load_missing_constant 'beginnen: nicht initialisierte Konstante Youtube (Nameerror) –

+0

Das ist seltsam, weil Initialisierer ausgeführt werden, nachdem alle Plugins und Edelsteine ​​geladen sind. Bist du sicher, dass dort kein Tippfehler ist (wie YouTube)? Wenn dies nicht der Fall ist, versuchen Sie, die Datei mit der Klasse "Youtube :: display" am Anfang des Initialisierers zu erstellen. –

+0

Require fehlte und auch Tippfehler, Initiatoren laden, bevor alle Edelsteine ​​geladen sind Danke –

-2

ich eine solche Lösung erarbeitet haben, die erfordert nicht die Rails Neustart des Servers nach jeder Codeänderung (im Gegensatz zu allen des anderen Lösungen):

1. erstellen 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

Möchten Sie etwas mehr ausarbeiten? – RamenChef

+0

was genau mehr? – prograils

+0

Ja, dieser Ansatz ist nicht effektiv - aber ich habe keinen besseren Weg gefunden. Setzen Sie diesen Code in Initialisierer (wie jeder tut) ist viel schlechter (was bedeutet, den Server bei jedem Codewechsel neu zu starten). – prograils

Verwandte Themen