Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在多个控制器之间方便地保存变量_Ruby On Rails_Ruby On Rails 3_Caching_Ruby On Rails 3.1 - Fatal编程技术网

Ruby on rails 如何在多个控制器之间方便地保存变量

Ruby on rails 如何在多个控制器之间方便地保存变量,ruby-on-rails,ruby-on-rails-3,caching,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3,Caching,Ruby On Rails 3.1,我已经将一个应用程序转移到使用ActiveResource,我发现我需要重新思考我教自己做一些事情的方式,我正在寻找最好的方法来实现这一点 例如,我需要随时准备一个查询,比如说@current\u account,我已经这样做了 @current_account ||= Account.where(etc etc) 在特定范围的applicationcontroller.rb中。这对于AR并不是很有用,因为每次都会调用API。我希望尽量减少对api的调用(特别是当我有其他更昂贵的调用时,我不想

我已经将一个应用程序转移到使用ActiveResource,我发现我需要重新思考我教自己做一些事情的方式,我正在寻找最好的方法来实现这一点

例如,我需要随时准备一个查询,比如说@current\u account,我已经这样做了

@current_account ||= Account.where(etc etc)
在特定范围的applicationcontroller.rb中。这对于AR并不是很有用,因为每次都会调用API。我希望尽量减少对api的调用(特别是当我有其他更昂贵的调用时,我不想在每个查询上运行它们,我希望运行它们一次并让它们方便使用)

那么,Rails的方式是什么?我必须在应用程序控制器的某个范围内,在其他几个控制器之间保留一个对API进行AR调用的变量,而不必每次都将其写出(或者每次调用API,或者将其放入用户可访问的会话中,因为它不完全是文本/字符串,而是我需要使用的对象)

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


任何输入都值得赞赏。

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

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/application.rb
中的
配置自动加载路径中:

# ./config/application.rb
...
config.autoload_path += %W(#{config.root}/lib)
...
class ApplicationController < ActionController::Base
  include CustomAuth
  protect_from_forgery

  ...
end
CustomAuth
模块导入您的
应用程序\u controller.rb

# ./config/application.rb
...
config.autoload_path += %W(#{config.root}/lib)
...
class ApplicationController < ActionController::Base
  include CustomAuth
  protect_from_forgery

  ...
end
class ApplicationController
最后一点至关重要:重新启动服务器


注意:您可以将其他方法添加到
自定义\u auth.rb
。如果重新启动服务器,它们将可用。这些方法在视图中也可用,因此您可以在视图中调用
当前账户.name

这是我所知道的“最干燥”的方法。您的所有身份验证名称空间都在一个模块中。您不会把身份验证逻辑等弄得乱七八糟。不要再问重复的问题:这意味着在Rails应用程序编程的上下文中有更广泛的范围,所以不会。花一些时间阅读,而不是浅层扫描。