在Rails中控制器和助手之间共享变量

时间:2009-11-23 07:23:36

标签: ruby-on-rails caching menu

在Rails中创建菜单时遇到一些麻烦。在ApplicationController中,我有一个set_menu方法:

def self.set_menu(menu, options = {})
  # ...
end

这是从每个控制器调用的,如下所示:

class UsersController < ApplicationController
  set_menu :users

  # ...
end

在set_menu中,我需要创建一个变量,我稍后可以在帮助器方法中找到该变量,以找出哪个菜单项是活动的。我通过使用类变量来实现这一点。这在开发中运行良好,但事实证明Rails将此变量缓存在生产中,因此活动菜单永远不会改变。

那么,我如何在set_menu中创建一个我可以从辅助方法到达的变量,并且生产阶段不会缓存?

1 个答案:

答案 0 :(得分:4)

实例变量在控制器和视图之间共享,包括帮助程序。

class ApplicationController

  def self.set_menu(menu, options = {})
    before_filter(options) do |controller|
      controller.send(:set_menu, menu)
    end
  end

  # ...


  protected

    def set_menu(menu)
      @menu = menu
    end

end

# in your view
<%= @menu %>

如果您想创建更复杂的导航菜单,请查看我的Tabs On Rails宝石。