2014-02-12 5 views
1

У меня есть приложение rails, выступающее в качестве клиента API.Метод доступа к контроллеру класса Ruby

Как только пользователь заходит, маркер сохраняется для отправки с каждым последующим запросом 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

Вам также необходимо установить current_api_client, чтобы каждый запрос получил свой собственный экземпляр api_client с правильным 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 

Теперь в вашей модели вы можете получить доступ к ApplicationController.current_api_client.

Это один из многих способов сделать это. Это быстро и легко и подходит для вашего опубликованного кода без слишком большого количества изменений.

Смежные вопросы