ruby-on-rails - gems - instalar gemas de ruby en windows
Anulando un método de módulo de una gema en Rails (3)
La gema will_paginate se rompe en mi versión de Oracle. El método predeterminado paginate_by_sql en el módulo WillPaginate está insertando un ''AS'' ''extra en una consulta y haciendo que falle.
El código en sí se soluciona fácilmente, pero no estoy seguro de cuál es la mejor manera de 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 contenga:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
y requiriéndolo desde environment.rb, pero no está recogiendo mis cambios. También traté de requerirlo desde los controladores / application.rb, pero de nuevo, no recogiendo mis cambios.
Temporalmente, conseguí que funcionara anulando el método dentro del modelo específico en sí, pero esto es un poco complicado, 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 hacerlo, pero no estoy teniendo suerte siguiendo su rastro con Google.
Lo que está haciendo funcionará, pero su código debe verse así:
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
En otras palabras, vaya a finder.rb, elimine todo, excepto los encabezados del módulo y el método que desea sobrescribir, luego guárdelo en un archivo en lib e inclúyalo en environment.rb. ¡Voila, parche de mono instantáneo!
Una solución más concisa:
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
Coloque el código en un archivo de inicializador en config / initializers. Este es el lugar correcto para colocar el código que se debe ejecutar cuando se carga el entorno. También organiza mejor el código, haciendo que la intención de cada archivo sea más clara, por lo que los errores serán más fáciles de rastrear. ¡No desordene el medio ambiente! Rb!
Ok, voy a hacer que esto sea más fácil para personas como yo, que aparecen y aún luchan un poco 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 encontrar fácilmente esto usando la palanca ) que desea cambiar en la gema, y luego seleccione Code
a la izquierda en lugar de Issues
Luego, copie el contenido del módulo que desea cambiar y colóquelo en un archivo .rb
llamado dentro de la 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.
¡Fuera, vete!