Override di un metodo di modulo da un gioiello in Rails
-
06-09-2019 - |
Domanda
La gemma will_paginate è rotto sulla mia versione di Oracle. Il metodo predefinito paginate_by_sql
nel modulo WillPaginate sta inserendo un extra 'AS' in una query e causando il fallimento.
Il codice stesso è facilmente risolto, ma non sono sicuro del modo migliore per ottenere Rails per ritirare il mio cambiamento.
Non voglio cambiare il codice nella gemma stessa, come che lascerà il mio codice rotto su altre macchine.
Ho cercato di creare un file lib / test.rb contenente:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
e che richiedono da environment.rb, ma non è raccogliendo i miei cambiamenti. Ho anche provato che richiedono da controllori / application.rb, ma ancora una volta, non raccogliendo i miei cambiamenti.
Temporaneamente, ho preso a lavorare per l'override del metodo all'interno del modello specifico in sé, ma questo è un po 'di un hack, e significa che non posso usarlo su uno qualsiasi degli altri modelli in questo progetto.
Sono sicuro che c'è un modo semplice per fare questo, ma io non sto avendo alcuna fortuna di monitoraggio verso il basso utilizzando Google.
Soluzione
Quello che state facendo lavorare volontà, ma il codice ha bisogno di guardare in questo modo:
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
In altre parole, andare in finder.rb, eliminare tutto tranne le intestazioni di modulo e il metodo che si desidera sostituire, quindi salvare in un file in lib e includere nella environment.rb. Voila, patch di scimmia istante!
Altri suggerimenti
Una soluzione più concisa:
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
Inserire il codice in un file di inizializzazione in config / inizializzatori. Questo è il posto giusto per inserire il codice che deve essere eseguito quando l'ambiente è caricato. E 'anche meglio organizzare il codice, rendendo l'intento di ogni file più chiaro, quindi i bug saranno più facili da rintracciare. Non ingombrare environment.rb!
Ok, sto solo andando a rendere questo più facile per le persone come me che vengono insieme e ancora lottare un po 'dopo aver letto le altre risposte.
prima trovare il codice che si desidera modificare sul repo github ricercando la riga di codice (si potrebbe facilmente trovare questo utilizzando leva ) che si desidera modificare nel gioiello, e quindi selezionando Code
a sinistra al posto di Issues
Avanti Copiare il contenuto del modulo che si desidera modificare e metterlo in un file .rb
nome appropriato all'interno della cartella config / inizializzatori. Ecco un esempio:
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
Ora, modificarla in:
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
Ora, apportare ulteriori modifiche al codice e riavviare il server.
si va via!