Ruby on rails 3 如何从Rails 3中的视图更改控制器实例变量live

Ruby on rails 3 如何从Rails 3中的视图更改控制器实例变量live,ruby-on-rails-3,Ruby On Rails 3,在我们的应用程序中,我们有一个gem,它为运行Rails应用程序的五个web站点提供通用代码。文件lib/theme/controller\u module.rb中的gem中有以下代码: def application_javascripts(*items) @application_javascripts ||= [] @application_javascripts += items end def application_js_include_tag if @applicat

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

def application_javascripts(*items)
  @application_javascripts ||= []
  @application_javascripts += items
end
def application_js_include_tag
  if @application_javascripts
    javascript_include_tag( *@application_javascripts)
  end
end
文件
helpers/theme\u helper.rb
中的gem中有以下代码:

def application_javascripts(*items)
  @application_javascripts ||= []
  @application_javascripts += items
end
def application_js_include_tag
  if @application_javascripts
    javascript_include_tag( *@application_javascripts)
  end
end
主题gem位于每个应用程序的
gem文件中。在控制器代码和帮助程序中,
application\u javascripts
执行以跟踪页面上使用的特定于页面的JavaScript,并且
application\u js\u include\u标记
放置在视图的底部,以仅提供这几个文件


不幸的是,一旦视图开始渲染,视图中的
@application\u javascripts
值似乎不会更新。当在页面底部执行
application\u js\u include\u tag
时,帮助程序中出现的对
@application\u javascripts
的添加对视图不可用。我是否需要一个单独的助手,比如
application\u javascripts
,其中定义了一个变量,并在
application\u js\u include\u tag
中同时使用?还是其他解决办法

从其行为来看,似乎在渲染开始时拍摄了
@application\u javascripts
的快照。在渲染期间执行
controller.application\u javascripts
不会更改视图中可用的
@application\u javascripts
的值。在
helpers/theme\u helper.rb中定义:

def application_javascripts(*items)
  controller.application_javascripts(*items)
end
也不会更改该值。工作原理是复制代码,以便驻留在helper文件中的代码更改
@application\u javascripts
。在
helpers/theme\u helper.rb中定义控制器代码的副本:

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