2010-04-22 10 views
14

Mejor práctica para anular un método de clase de la gema en rieles ¿Aplicación? . Necesito anular el comportamiento del método de búsqueda de una gema.Cómo anular un método de clase de la gema en la aplicación de rieles?

siguiente es el código de la joya

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 

¿Cómo puedo reemplazar el método de búsqueda más arriba en mi Controlador YoutubeSearch de rieles de aplicaciones?

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

Respuesta

26

Crear un archivo .rb en config/initializers directorio con el siguiente código:

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

Gracias por su respuesta cuando he intentado su código que vaya este error cuando inicio una instancia mestizo 'load_missing_constant ': sin inicializar constantes Youtube (NameError) –

+0

Esto es extraño, porque los inicializadores se ejecutan después de cargar todos los complementos y gemas. ¿Estás seguro de que no hay ningún error tipográfico allí (como YouTube)? Si no lo hay, intente 'requerir' el archivo con la clase' Youtube :: display' al comienzo del inicializador. –

+0

requerían falta y también Typo err, los inicializadores cargan antes de que se carguen todas las gemas. Gracias –

-2

he elaborado una solución de este tipo que NO SE requieren el reinicio del servidor rieles después de cada cambio de código (a diferencia de todos las soluciones de la otra):

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

¿Cuidar para elaborar un poco más? – RamenChef

+0

¿qué exactamente más? – prograils

+0

Sí, este enfoque no es efectivo, pero no he encontrado una manera mejor. Poner este código en los inicializadores (como todos lo hacen) es mucho peor (lo que significa reiniciar el servidor cada vez que se cambia el código). – prograils

Cuestiones relacionadas