Ruby类访问应用程序控制器方法

时间:2014-02-12 22:11:20

标签: ruby-on-rails ruby api

我有一个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'之类的操作。但是,有没有一种正确的方法从模型中访问它?

1 个答案:

答案 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

这是实现这一目标的众多方法之一。它快速简便,适合您发布的代码而无需太多更改。