【问题标题】:Rails bootstrap gem monkeypatching method not workingRails bootstrap gemmonkeypatching方法不起作用
【发布时间】:2014-06-12 00:56:05
【问题描述】:

我正在使用出色的 twitter-bootstrap-rails gem。该 gem (NavbarHelper) 中有一个帮助程序,用于使用 Ruby 帮助程序生成 Bootstrap 导航栏。我想对 gem 进行修补,以使下拉列表中没有插入符号。

于是,我查了源码,找到了相关方法here。我所要做的就是覆盖它。我在 config/initializers 中创建了一个名为 navbar.rb 的新文件,其内容如下:

NavbarHelper.module_eval do
  def name_and_caret(name)
    "HELLO WORLD"
  end
end

据推测,所有下拉标题都应该在我的应用程序中呈现为“HELLO WORLD”(正如 gem 源代码所引用的那样)。但是,这并没有发生,并且 gem 似乎根本没有被猴子补丁。

我尝试将 puts NavbarHelper.methods - Object.methods 放在初始化程序文件中,但没有结果,这让我认为 Rails 在初始化程序之前没有正确加载 gem。我还检查并确认 gem 没有为其助手使用自动加载。

编辑

我的Gemfile 以下列方式包含gem,这可能会使情况复杂化:

gem 'twitter-bootstrap-rails', git: 'git://github.com/seyhunak/twitter-bootstrap-rails.git', branch: 'bootstrap3'

我不确定这个特定版本是否意味着猴子补丁不起作用。

编辑#2

我的系统上似乎只有一个版本的 gem,所以我认为这不是问题所在。另外,我尝试将require 'twitter-bootstrap-rails 放在初始化程序文件的顶部,但没有结果。

【问题讨论】:

  • 以更直接的方式尝试猴子修补 - module NavbarHelper\ndef name_and_caret(name)\n...\nend\nend... 还要确保你 require navbar_helper 在运行此代码之前
  • @UriAgassi 我尝试了这种方法,但没有奏效。另外,我不确定 require 语法,但我尝试过要求文件顶部的 gem,但这也不起作用。

标签: ruby-on-rails ruby ruby-on-rails-4 monkeypatching


【解决方案1】:

问题是您在此模块上修补了方法,但此时该模块已包含在内。尝试在您的 application_helper.rb 中定义它

def name_and_caret(name)
  super("blub #{name}")
end

【讨论】:

  • 这行得通!两个问题。 (1) 如果这是在application_helper中定义的,Ruby怎么知道这个方法是NavbarHelper模块的一部分?
  • (2) 为什么在这种情况下模块已经被包含在内?现有的猴子补丁解决方案是这样工作的:stackoverflow.com/a/17220421/353878
  • (1) 它没有,两个模块都包含在 actionview 实例中 (2) 类与模块有点不同,包含模块与从类继承不同。在 ruby​​ 中进行修补可能非常棘手。我完全不明白 :) 有帮助:which method do I really call?
  • 啊,我不知道他们是这样包含的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多