Ruby on rails 如何在多个控制器之间方便地保存变量
我已经将一个应用程序转移到使用ActiveResource,我发现我需要重新思考我教自己做一些事情的方式,我正在寻找最好的方法来实现这一点 例如,我需要随时准备一个查询,比如说@current\u account,我已经这样做了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的调用(特别是当我有其他更昂贵的调用时,我不想
@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应用程序编程的上下文中有更广泛的范围,所以不会。花一些时间阅读,而不是浅层扫描。