Anulando un método de módulo desde una gema en Rails
-
06-09-2019 - |
Pregunta
La gema will_paginate está rota en mi versión de Oracle.El valor por defecto paginate_by_sql
El método en el módulo WillPaginate inserta un 'AS' adicional en una consulta y hace que falle.
El código en sí se puede arreglar fácilmente, pero no estoy seguro de cuál es la mejor manera de hacer que Rails recoja mi cambio.
No quiero cambiar el código en la gema en sí, ya que eso dejará mi código roto en otras máquinas.
Intenté crear un archivo lib/test.rb que contiene:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
y solicitándolo desde Environment.rb, pero no recoge mis cambios.También intenté solicitarlo desde controladores/application.rb, pero nuevamente, no capté mis cambios.
Temporalmente, lo hice funcionar anulando el método dentro del modelo específico, pero esto es un truco y significa que no puedo usarlo en ninguno de los otros modelos en este proyecto.
Estoy seguro de que hay una manera fácil de hacer esto, pero no tengo suerte para rastrearlo usando Google.
Solución
Lo que está haciendo el trabajo voluntad, pero su código necesita tener este aspecto:
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
En otras palabras, entra en finder.rb, borrar todo excepto las cabeceras de los módulos y el método que desea anular, a continuación, guardar en un archivo en lib e incluir en environment.rb. Voila, instantánea parche mono!
Otros consejos
Una solución más concisa:
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
Ponga el código en un fichero de inicialización en config / inicializadores. Este es el lugar correcto para colocar el código que debe ejecutarse cuando se carga el medio ambiente. También organiza mejor su código, haciendo la intención de cada archivo más clara, por lo que los errores serán más fáciles de localizar. No estorbar encima environment.rb!
Ok, voy a hacer esto más fácil para personas como yo que vienen y todavía tienen dificultades después de leer las otras respuestas.
Primero encuentre el código que desea cambiar en el repositorio de github buscando la línea de código (puede encontrarlo fácilmente usando palanca) deseas cambiar en la gema, y luego seleccionando Code
a la izquierda en lugar de Issues
Próximo Copie el contenido del módulo que desea cambiar y colóquelo en un lugar con el nombre apropiado .rb
archivo dentro de su carpeta config/initializers.Aquí hay un ejemplo:
module Forem
module TopicsHelper
def link_to_latest_post(post)
text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}"
link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}")
end
end
end
Ahora, cámbialo a:
Forem::TopicsHelper.module_eval do
def link_to_latest_post(post)
text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}"
link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}")
end
end
Ahora, realice cambios adicionales en el código y reinicie su servidor.
¡Vete!