Подтвердить что ты не робот

Переопределение метода модуля из драгоценного камня в Rails

Жесткость will_paginate нарушена в моей версии Oracle. По умолчанию метод paginate_by_sql в модуле WillPaginate вставляет лишний "AS" в запрос и вызывает его сбой.

Сам код легко фиксируется, но я не уверен в том, что Rails сможет получить мои изменения.

Я не хочу менять код в самом камне, так как это оставит мой код сломанным на других машинах.

Я попытался создать файл lib/test.rb, содержащий:

module WillPaginate
  def paginate_by_sql
    (my code goes here)
  end
end

и требуя его от environment.rb, но он не подбирает мои изменения. Я также попытался потребовать его от контроллеров /application.rb, но опять же, не поднимая мои изменения.

Временно, я получил его для работы, переопределив метод внутри самой конкретной модели, но это немного взломать и означает, что я не могу использовать его ни на одной из других моделей в этом проекте.

Я уверен, что есть простой способ сделать это, но мне не удавалось отслеживать его с помощью Google.

4b9b3361

Ответ 1

То, что вы делаете, будет работать, но ваш код должен выглядеть так:

module WillPaginate
  module Finder
    module ClassMethods
      def paginate_by_sql(sql, options)
        # your code here
      end
    end
  end
end

Другими словами, перейдите в finder.rb, удалите все, кроме заголовков модулей, и метод, который вы хотите переопределить, затем сохраните файл в lib и включите в environment.rb. Voila, мгновенный патч обезьяны!

Ответ 2

Более сжатое решение:

WillPaginate::Finder::ClassMethods.module_eval do
 def paginate_by_sql sql, options
   # Your code here
 end
end

Поместите код в файл инициализации в config/initializers. Это правильное место для размещения кода, который необходимо запустить при загрузке среды. Он также лучше организует ваш код, делая каждый файл более понятным, поэтому ошибки будут легче отслеживать. Не загромождать environment.rb!

Ответ 3

Хорошо, я просто сделаю это проще для таких людей, как я, которые приходят и все еще немного борются, прочитав другие ответы.

Сначала найдите код, который вы хотите изменить в реестре github, выполнив поиск строки кода (вы можете легко найти это с помощью pry), который вы хотите изменить в камне, а затем выберите Code слева вместо Issues

enter image description here

enter image description here

Далее Скопируйте содержимое модуля, который вы хотите изменить, и поместите его в точно названный файл .rb внутри папки config/initializers. Вот пример:

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

Теперь измените его на:

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

Теперь внесите дополнительные изменения в код и перезапустите сервер.

Уходите!