0

在我们的应用程序中,我们有一个 gem,它为五个运行 Rails 应用程序的网站提供通用代码。在文件中的 gem 中lib/theme/controller_module.rb是以下代码:

def application_javascripts(*items)
  @application_javascripts ||= []
  @application_javascripts += items
end

在文件中的 gem 中helpers/theme_helper.rb是以下代码:

def application_js_include_tag
  if @application_javascripts
    javascript_include_tag( *@application_javascripts)
  end
end

主题宝石位于每个应用程序的Gemfile. 在控制器代码和帮助程序中,application_javascripts执行以跟踪页面上使用了哪些特定于页面的 JavaScript,并将其application_js_include_tag放置在视图的底部以仅使那几个文件可用。

@application_javascripts不幸的是,一旦视图开始渲染,视图中的值似乎不会更新。在页面底部执行时,在帮助程序中添加@application_javascripts的内容对视图不可用。application_js_include_tag我是否需要一个单独的助手,比如application_javascripts在那里定义的变量,并在其中使用两者application_js_include_tag?还是其他解决方案?

4

1 回答 1

0

从它的行为来看,似乎@application_javascripts是在渲染开始时拍摄的。在渲染期间执行controller.application_javascripts不会更改@application_javascripts视图中 available 的值。定义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

工作正常。

于 2013-01-31T18:58:43.187 回答