在我们的应用程序中,我们有一个gem,它为运行Rails应用程序的五个网站提供通用代码。在文件lib/theme/controller_module.rb
中的gem中有以下代码:
def application_javascripts(*items)
@application_javascripts ||= []
@application_javascripts += items
end
文件helpers/theme_helper.rb
中的gem是以下代码:
def application_js_include_tag
if @application_javascripts
javascript_include_tag( *@application_javascripts)
end
end
主题gem位于每个应用程序的Gemfile
中。在控制器代码和帮助程序中,application_javascripts
执行以跟踪页面上使用的特定于页面的JavaScript,并且application_js_include_tag
位于视图的底部,以便只提供这些文件。
不幸的是,一旦视图开始渲染,看起来@application_javascripts
值不会在视图中更新。在页面底部执行@application_javascripts
时,视图无法使用助手中出现的application_js_include_tag
添加内容。我是否需要一个单独的帮助器,如application_javascripts
,并在那里定义一个变量,并在application_js_include_tag
中使用它们?或其他一些解决方案?
答案 0 :(得分:0)
从其行为来看,似乎在渲染开始时拍摄@application_javascripts
的快照。在呈现期间执行controller.application_javascripts
不会更改视图中可用的@application_javascripts
的值。在helpers/theme_helper.rb
中定义:
def application_javascripts(*items)
controller.application_javascripts(*items)
end
也不会更改该值。什么工作,是重现代码,以便@application_javascripts
由驻留在帮助文件中的代码更改。在helpers/theme_helper.rb
中定义控制器代码的副本:
def application_javascripts(*items)
@application_javascripts ||= []
@application_javascripts += items
end
工作正常。