辅助方法不会通过 rails 控制台中的 `reload!` 重新加载

Posted

技术标签:

【中文标题】辅助方法不会通过 rails 控制台中的 `reload!` 重新加载【英文标题】:Helper method doesn't reload by `reload!` in rails console 【发布时间】:2014-12-08 20:40:46 【问题描述】:

我有一个这样的辅助方法:

module PostsHelper
  def foo
    "foo"
  end
end

在rails控制台中我检查了函数,然后将文本"foo"更改为"bar",然后reload!控制台,但helpers.foo仍然没有返回"bar"

也许 Helper 对象已经像这篇文章一样在控制台中创建了,我不确定。 Rails Console: reload! not reflecting changes in model files? What could be possible reason?

我只想知道如何在 Rails 控制台中使用辅助方法。你能告诉我怎么做吗?

【问题讨论】:

【参考方案1】:

helper 表示一个已经实例化的对象,因此不受对 reload! 的调用的影响,这是正确的。控制台中的helper方法定义为:

def helper
  @helper ||= ApplicationController.helpers
end

第一次调用helper,它会记住ApplicationController 助手。当您调用 reload! 时,ApplicationController 类(以及它的助手)会重新加载,但 helper 方法仍在查看旧实例。

你可以直接调用ApplicationController.helpers而不是使用helper方法,运行reload!后你会看到你的变化:

> helper.foo
# => "foo"
> ApplicationController.helpers.foo
# => "foo"
> # Change the return value of PostsHelper from "foo" to "bar"
> reload!
> helper.foo
# => "foo"
> ApplicationController.helpers.foo
# => "bar"

编辑

从 Rails 5 开始,这将不再是问题。 PR was merged 用于从 helper 控制台方法中删除记忆。

【讨论】:

【参考方案2】:

假设您有一个如下所示的辅助模块:

module CarsHelper

  def put_a_car_in(location)
    if location == "your car"
      puts "So you can drive while you drive!"
    end
  end

end

启动一个 Rails 控制台,并创建 helper-helper,你所要做的就是包含模块:

>> include CarsHelper # It is not necessary to include module
=> Object

>> helper.put_a_car_in("your car") # simply write helper.your_method_name
So you can drive while you drive!

reload! 不工作我也试过。您必须从 rails consolequit 并再次启动 rails c 以检查更改..希望对您有所帮助..

【讨论】:

以上是关于辅助方法不会通过 rails 控制台中的 `reload!` 重新加载的主要内容,如果未能解决你的问题,请参考以下文章

从 Rails 控制台重新加载帮助程序

如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?

如何在 Rails 中正确使用控制器辅助模块,以及如何连接这些辅助模块?

从 Rails 3 控制器调用辅助方法

如何测试作为 helper_method 公开的 Rails 控制器方法?

rails:如何覆盖 cocoon gem 辅助方法并调用原始方法