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.

¿Fue útil?

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

enter image description here

enter image description here

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top