如何从Rails 3中的视图实时更改控制器实例变量

时间:2013-01-27 05:22:05

标签: ruby-on-rails-3

在我们的应用程序中,我们有一个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中使用它们?或其他一些解决方案?

1 个答案:

答案 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

工作正常。