Переопределение метода модуля из драгоценного камня в 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.
Ответы
Ответ 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
Теперь внесите дополнительные изменения в код и перезапустите сервер.
Уходите!