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.

Foi útil?

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

enter descrição da imagem aqui

enter descrição da imagem aqui

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top