如何从 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_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

工作正常。

相关内容

  • 没有找到相关文章

最新更新