需要有关代码气味的帮助

时间:2010-08-25 23:16:38

标签: ruby-on-rails

在我的Rails应用程序中,我正在尝试使控制器更加纤薄,并且在我不得不传递的一个对象上遇到困难。

该对象代表用户的facebook会话,并且在会话之外被实例化,因此它存在于控制器端。许多模型方法都使用它,因此它会在整个地方重复传递。

这闻起来像是什么,如何干涸Rails方式?谢谢!

3 个答案:

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