我有一个rails应用程序充当API客户端。
用户登录后,会保存一个令牌,以便随后向API发送每个请求。
这是我的代码(非常简化):
# /lib/api_client.rb
class ApiClient
def get(path, options = {})
# options.merge! headers: {'Authorization' => 'Token mytoken'}
HTTParty.get("http://api.myapp.com/#{path}", options)
end
end
# /app/models/user.rb
class User
def self.exists?(id)
api.get("users/#{id}").success?
end
def self.api
@api ||= ApiClient.new
end
end
# /app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def signed_in?
current_auth_token.present?
end
def current_auth_token
cookies.signed[:user_token]
end
end
我的问题是ApiClient
可以t access the
ApplicationController so it has no way to know if there is an
auth_token`。
现在,在Authorization
的每次调用中自动添加current_auth_token
包含ApiClient#get
标头的最佳方式是什么?
我的另一个解决方案是初始化控制器中的ApiClient
,然后我就可以执行api_client.auth_token = 'mytoken'
之类的操作。但是,有没有一种正确的方法从模型中访问它?
答案 0 :(得分:0)
您还必须设置current_api_client
,以便每个请求获得具有正确api_client
的{{1}}的自己的实例。在应用程序控制器中设置current_auth_token
,但将其分配给类变量,以便您可以从模型中轻松访问它:
api_client
现在,您可以在模型中访问class ApplicationController < ActionController::Base
cattr_accessor :current_api_client
# this will reset the api_client on every request using the current_auth_token
before_filter do |c|
ApplicationController.current_api_client = ApiClient.new token: current_auth_token # or however you set this in the client
end
#...
end
。
这是实现这一目标的众多方法之一。它快速简便,适合您发布的代码而无需太多更改。