Переопределение метода модуля из драгоценного камня в Rails
-
06-09-2019 - |
Вопрос
Гем 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
Следующий Скопируйте содержимое модуля, который вы хотите изменить, и поместите его в папку с подходящим названием. .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
Теперь внесите дополнительные изменения в код и перезапустите сервер.
Прочь, иди!