辅助方法不会通过 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 console
到 quit
并再次启动 rails c 以检查更改..希望对您有所帮助..
【讨论】:
以上是关于辅助方法不会通过 rails 控制台中的 `reload!` 重新加载的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?
如何在 Rails 中正确使用控制器辅助模块,以及如何连接这些辅助模块?