从在Rails宝石重写一个模块的方法
-
06-09-2019 - |
题
在will_paginate gem是是在我的版本的Oracle的断裂。所述WillPaginate模块中的默认paginate_by_sql
方法插入一个额外的“AS”到一个查询并使其失效。
在代码本身是很容易固定,但我不知道的让Rails的拿起我的变化的最佳方式。
我不希望改变宝石本身的代码,因为这将打破留在其它机器上我的代码。
我试图创建含有LIB / test.rb文件:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
和从environment.rb中需要它,但它不是拿起我的变化。 我也尝试从控制器/ application.rb中需要它,但同样,没有拿起我的变化。
暂时,我把它通过覆盖特定模型本身内的方法来工作,但是这是一个黑客位,并意味着我不能在这个项目中使用它在任何其他车型。
我敢肯定有一个简单的方法来做到这一点,但我没有任何运气跟踪下来使用谷歌。
解决方案
你在做的工作,但你的代码需要看起来像这样:
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
把代码到配置/初始化的初始化文件。这是把需要加载环境时运行的代码的正确位置。这也更好地组织你的代码,使每一个文件的意图更加清晰,因此,虫子会更容易追查。不要弄乱的environment.rb!
确定,我只是要简化这一过程的人喜欢我谁一起去,并还在读其他的答案后,挣扎了一下。
第一发现,你想搜索的代码行改变对GitHub库的代码(你可以很容易地找到这个使用的 <强>撬强上要在宝石改变,> ),然后选择Code
左代替Issues
下一步复制你想改变,并将其放置到你的config /初始化文件夹内的恰当地命名.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
现在,对代码做任何额外的更改并重新启动服务器。
远离你去!