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

StackOverflow https://stackoverflow.com/questions/580314

Вопрос

Гем 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.

Это было полезно?

Решение

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

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

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

Другие советы

Более краткое решение:

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

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

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

Первый найдите код, который вы хотите изменить, в репозитории GitHub, выполнив поиск строки кода (вы можете легко найти это, используя подглядывать), который вы хотите изменить в драгоценном камне, а затем выбрав 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

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

Прочь, иди!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top