Substituindo um método módulo de uma jóia em Rails
-
06-09-2019 - |
Pergunta
A jóia will_paginate é quebrado na minha versão do Oracle. O método paginate_by_sql
padrão no módulo WillPaginate é inserir um extra 'AS' em uma consulta e fazendo-a falhar.
O código em si é facilmente corrigido, mas eu não tenho certeza da melhor maneira de obter Rails para pegar a minha mudança.
Eu não quero alterar o código no próprio gem, como que vai deixar o meu código quebrado em outras máquinas.
Eu tentei criar um arquivo lib / test.rb contendo:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
e exigindo-lo de environment.rb, mas não está pegando as minhas alterações. Eu também tentou obrigá-la a partir de controladores / application.rb, mas novamente, não pegar as minhas alterações.
Temporariamente, eu tenho que trabalhar, substituindo o método dentro do próprio modelo específico, mas isso é um pouco de um truque, e significa que não posso usá-lo em qualquer um dos outros modelos nesse projeto.
Eu tenho certeza que há uma maneira fácil de fazer isso, mas eu não estou tendo sorte segui-lo para baixo, usando o Google.
Solução
O que você está fazendo o trabalho de vontade, mas suas necessidades de código para ficar assim:
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
Em outras palavras, entrar em finder.rb, tudo de exclusão, exceto os cabeçalhos do módulo e o método que você deseja substituir, em seguida, salvar em um arquivo em lib e incluir no environment.rb. Voila, adesivo instantâneo macaco!
Outras dicas
Uma solução mais concisa:
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
Coloque o código em um arquivo inicializador em config / initializers. Este é o lugar correto para colocar o código que precisa ser executado quando o ambiente está carregado. É também melhor organiza seu código, fazendo de cada arquivo intenção mais clara, assim, erros serão mais fáceis de rastrear. Não fiquem amontoados environment.rb!
Ok, eu só vou fazer isso mais fácil para pessoas como eu que vêm junto e ainda lutam um pouco depois de ler as outras respostas.
Primeiro encontrar o código que você deseja alterar na repo github, ao procurar a linha de código (você pode facilmente encontrar isso usando usurpação ) que pretende alterar na gema, e em seguida, selecionando Code
à esquerda em vez de Issues
Avançar Copie o conteúdo do módulo que você deseja alterar e coloque-o em um dentro do arquivo .rb
apropriadamente chamado de initializers sua pasta config /. Aqui está um exemplo:
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
Agora, mude para:
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
Agora, fazer quaisquer alterações adicionais ao código e reiniciar o servidor.
você vai longe!