我正在试图弄清楚如何优雅地将外部API客户端公开给我的rails应用程序中的模型,这取决于当前会话。这是我的ApplicationController的片段:
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 :(得分: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世界中控制器的主要功能是直接控制事物。给模型过多的自主权会让人担心。