在我们的应用程序中,我们有一个 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_js_include_tag
时,视图无法对帮助程序中发生的@application_javascripts
添加内容。我是否需要一个单独的帮助程序,例如 application_javascripts
并在那里定义了一个变量,并在 application_js_include_tag
中使用两者?还是其他解决方案?
从其行为来看,似乎在渲染开始时拍摄了@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
工作正常。