我的Oracle版本破坏了will_paginate gem。 WillPaginate模块中的默认paginate_by_sql
方法是在查询中插入额外的“AS”并导致其失败。
代码本身很容易修复,但我不确定让Rails获取更改的最佳方法。
我不想更改gem本身的代码,因为这会让我的代码在其他机器上被破坏。
我尝试创建一个包含以下内容的lib / test.rb文件:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
并要求它来自environment.rb,但它没有取消我的更改。 我也尝试过来自controllers / application.rb,但是再一次,没有拿起我的更改。
暂时,我通过覆盖特定模型本身的方法来实现它,但这有点像黑客,这意味着我不能在这个项目中的任何其他模型上使用它。
我确信有一种简单的方法可以做到这一点,但我没有运气跟踪谷歌。
答案 0 :(得分:67)
更简洁的解决方案:
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
将代码放入config / initializers中的初始化文件中。这是放置环境时需要运行的代码的正确位置。它还可以更好地组织您的代码,使每个文件的意图更加清晰,从而更容易追踪错误。不要混淆环境.rb!
答案 1 :(得分:49)
好的,我只是想让像我这样的人更容易,并且在阅读其他答案后仍然有点挣扎。
首先通过搜索您希望在gem中更改的代码行(您可以使用pry轻松找到此代码)找到要在github repo上更改的代码,然后选择左侧的Code
而不是Issues
下一步复制要更改的模块的内容,并将其放入config / initializers文件夹中名称恰当的.rb
文件中。这是一个例子:
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
现在,对代码进行任何其他更改并重新启动服务器。
你走了!
答案 2 :(得分:29)
您正在做的事情会有效,但您的代码需要如下所示:
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
换句话说,进入finder.rb,删除除模块头和要覆盖的方法之外的所有内容,然后保存到lib中的文件并包含在environment.rb中。瞧,即时猴子补丁!