2016-05-31 60 views
0

我試圖找出如何優雅地暴露外部API客戶端模式在我的Rails應用程序,它依賴於當前的會話。這裏是我的ApplicationController的一個片段:Rails的會話相關的常數

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 

private 
    def user_api 
    @api ||= HollerAPI.new(current_user.jwt, :user) if current_user 
    end 
end 

但是,這個user_api是模型不可訪問的。相反,這將是真棒,如果我可以定義一個常量,例如USER_API,然後在應用程序中無處不在的訪問。有沒有辦法完成這個?

回答

0

的模型世界和控制器的世界保持獨立。您必須小心填補這一空白,以避免造成總體混亂,其中來自與特定用戶有關的請求的數據流入另一個請求。

如果您需要做的事情與由控制器配置的API的模型,讓控制器接管控制:

@model = SomeModel.find(...) 

user_api.post_model(@model) 

儘量避免製作模型太聰明或智能。這可能會導致非常難以測試的難以預測的副作用。

如果你絕對必須提供一個橋樑,你的模型,一個屬性添加到您的模型,你可以用它來填充這個:

class MyModel < ActiveRecord::Base 
    attr_accesssor :user_api 
end 

然後你就可以通過控制器來填充這一點,並在模型中使用它:

@model = MyModel.find(...) 
@model.user_api = user_api 

橋接的差距:

class MyModel < ActiveRecord::Base 
    def do_stuff_with_api 
    user_api.post_model(self) 
    end 
end 

記住MVC世界中控制器的主要功能是直接控制事物。給模型太多的自主性會讓人擔憂。

+0

第一個建議的問題是,我現在正在創建一個客戶端庫,它明確接受特定於此應用程序的參數。 –

+1

除非模型能夠找出它應該使用的API憑證,否則您確實需要將其留給控制器。通過線程局部變量之類的東西將事物傳播到模型是可能的,但這是非常危險的。 – tadman