在我的Rails应用程序中,我正在尝试使控制器更加纤薄,并且在我不得不传递的一个对象上遇到困难。
该对象代表用户的facebook会话,并且在会话之外被实例化,因此它存在于控制器端。许多模型方法都使用它,因此它会在整个地方重复传递。
这闻起来像是什么,如何干涸Rails方式?谢谢!
答案 0 :(得分:1)
我可以给你CakePHP方式(最初设计为像rails一样)。
所有CakePHP模型都扩展了相同的父AppModel,所有控制器都扩展了AppController。
我会在AppModel中创建一个表示对象的空参数。然后在AppController中,如果对象存在,我会将对象存储在当前模型的参数中。 CakePHP AppController中有一个名为beforeFilter()的回调,它在控制器中的任何代码之前触发。检查对象并将其存储在模型中的理想位置是Rails对此beforeFilter回调的等价物。
除非所有型号都不使用该对象。如果是这样,您可以将参数仅放在使用它的模型中(而不是父模型),然后在AppModel的beforeFilter中,您可以先检查模型是否具有该空参数。
我知道这不是Ruby,但它看起来像这样:
public function beforeFilter() {
if (isset($this->{$this->modelName}->yourObjectParameter)) {
$this->{$this->modelName}->yourObjectParameter = $this->yourObject;
}
}
$this->modelName
是一个与当前模型名称对应的字符串。 PHP中的{ }
$this->modelName
称为复杂语法。它基本上将字符串转换为模型对象。不知道如何在Ruby中做同样的事情。
答案 1 :(得分:1)
首先,我建议您使用类似于Authlogic的系统进行身份验证。这会给你两个奖励:
class Widget < ActiveRecord::Base
def do_facebook_stuff
UserSession.find #This gets you the current session
UserSession.find.record # This gets your the user for the current session
end
end
现在您不再需要传递会话信息,因为您可以进行基本的模型式查找来查找它。除此之外,Authlogic还有一个支持Facebook Connect的插件架构,可以为您提供进一步的帮助。
答案 2 :(得分:0)
您可以将您的方法带到应用程序控制器,类似这样
class ApplicationController&lt;的ActionController ::基
before_filter:get_facebook_session
def get_facebook_session
@facebook_session = <your code >
结束
端
您可以从控制器和视图中访问@facebook_session变量
欢呼声
sameera