ruby-on-rails - 从 Rails 中的 gem 覆盖模块方法

标签 ruby-on-rails ruby gem will-paginate

will_paginate gem 在我的 Oracle 版本上损坏了。 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 中请求它,但同样没有获取我的更改。

暂时,我通过覆盖特定模型本身的方法让它工作,但这有点 hack,意味着我不能在这个项目中的任何其他模型上使用它。

我确信有一种简单的方法可以做到这一点,但我没有运气使用 Google 来追踪它。

最佳答案

更简洁的解决方案:

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

将代码放入 config/initializers 中的初始化文件中。这是放置加载环境时需要运行的代码的正确位置。它还可以更好地组织您的代码,使每个文件的意图更加清晰,从而更容易追踪错误。不要弄乱 environment.rb!

关于ruby-on-rails - 从 Rails 中的 gem 覆盖模块方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580314/

相关文章:

mysql - 如何在 Ruby on Rails 4 中创建比其父级具有更多属性的继承模型?

ruby - 具有身份验证的私有(private) Ruby Gem 服务器

ruby - Capybara-1.1.1 与 capybara 冲突 (~> 0.4.0)

css - Rails 5 - 使用 item_wrapper_tag 在 simple_form 中设置集合样式

ruby-on-rails - ruby 1.8 和 1.9 之间的字符串长度差异

ruby-on-rails - 将表单值传递给 Rails 中的 Controller

ruby - 举例来说,Ruby 中的 print 和 puts 有什么区别?

ruby-on-rails - Rails 类名称/类型不适用于多态 has_many :through

ruby-on-rails - ruby gem如何在rails环境下工作

ruby-on-rails - 设计: "Reset password token is invalid"消息