我已经将应用程序移动到使用ActiveResource,我发现我需要重新思考我自己做某些事情的方式,而我正在寻找最好的方法来解决这个问题。
例如,我需要保持一个方便的查询说@current_account我已经完成了
@current_account ||= Account.where(etc etc)
在applicationcontroller.rb中的某个范围。这对AR来说并不是那么有用,因为每次都会调用API。我想最大限度地减少对api的调用(尤其是我有其他更昂贵的调用,我不想在每个查询上运行,我想运行它们并保持它们的方便)
那么,Rails方式是什么?我必须保持一个变量,从一个范围内的ApplicationController,在几个其他控制器上方便地调用API,而不必每次都写出来(或者每次调用API,或者将它放在用户可访问的会话中)因为它不完全是文本/字符串,所以它是我需要使用的对象)。
我很好奇其他人如何做到这一点,如果我应该或不应该这样做,什么是正确的DRY方式等等。所以这有点开放。
任何意见都赞赏。
答案 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
。