如何在多个控制器中保留变量

时间:2011-12-05 19:58:51

标签: ruby-on-rails ruby-on-rails-3 caching ruby-on-rails-3.1

我已经将应用程序移动到使用ActiveResource,我发现我需要重新思考我自己做某些事情的方式,而我正在寻找最好的方法来解决这个问题。

例如,我需要保持一个方便的查询说@current_account我已经完成了

@current_account ||= Account.where(etc etc)

在applicationcontroller.rb中的某个范围。这对AR来说并不是那么有用,因为每次都会调用API。我想最大限度地减少对api的调用(尤其是我有其他更昂贵的调用,我不想在每个查询上运行,我想运行它们并保持它们的方便)

那么,Rails方式是什么?我必须保持一个变量,从一个范围内的ApplicationController,在几个其他控制器上方便地调用API,而不必每次都写出来(或者每次调用API,或者将它放在用户可访问的会话中)因为它不完全是文本/字符串,所以它是我需要使用的对象)。

我很好奇其他人如何做到这一点,如果我应该或不应该这样做,什么是正确的DRY方式等等。所以这有点开放。

任何意见都赞赏。

1 个答案:

答案 0 :(得分:1)

最好为这种行为创建一个模块:

module CustomAuth
  def self.included(controller)
    controller.send :helper_method, :current_account, :logged_in?
  end

  def current_account
    # note the Rails.cache.fetch. First time, it will
    # make a query, but it caches the result and not
    # run the query a second time.
    @current_account ||= Rails.cache.fetch(session[:account_id], Account.where(...))
  end

  def logged_in?
    !current_account.nil?
  end
end

然后,确保Rails加载此文件(我将其放入./lib/custom_auth.rb),因此将其添加到config.autoload_paths中的./config/application.rb

# ./config/application.rb
...
config.autoload_path += %W(#{config.root}/lib)
...

CustomAuth模块导入application_controller.rb

class ApplicationController < ActionController::Base
  include CustomAuth
  protect_from_forgery

  ...
end

最后,至关重要:重新启动服务器

注意:您可以向custom_auth.rb添加其他方法。如果重新启动服务器,它们将可用。视图中也提供了这些方法,因此您可以在视图中调用current_account.name