这个Rails 3 Controller方法让我看起来很胖吗?

时间:2010-10-26 14:42:17

标签: ruby-on-rails design-patterns refactoring ruby-on-rails-3 separation-of-concerns

这是一个新的应用程序,我在Search控制器上有一个索引方法。这也是应用程序的主页,我正在尝试从设计模式的角度来决定我是否走错了路。

该方法已经有35行。这是方法的作用:

3行设置变量,用于确定正在搜索分层数据的“级别”。

根据子域是否在请求中填充一些视图变量的另外10行。

基于以下内容重定向到两个页面之一的10行部分:

1)如果用户无权访问,并且已登录且尚未请求访问权限,请告诉他们“点击此处请求访问此品牌”。

2)如果用户没有访问权限,已登录并已请求访问权限,请告诉他们“正在审核您的请求”。

另外10行构建动态arel。

我无法直接理解如何区分这些问题,或者即使它们应该分开。感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:1)

这是设置了很多变量。也许这对于某种模块来说是个好机会?也许你的模块可以为你做出很多这些决定,也可以作为很多这些变量的包装器。对不起,我没有更具体的答案。

答案 1 :(得分:1)

总结你在代码中所说的内容(对不起,不知道ruby;认为它是伪代码):

void index() {
  establishHierarchyLevel();
  if (requestIncludedSubdomain())
    fillSubdomainFields();
  else
    fillNonsubdomainFields();
  if (user.isSignedIn() && !user.hasAccess()) {
    if (user.hasRequestedAccess())
      letUserIn();
    else
      adviseUserOfRequestUnderReview();
  }
  buildDynamicArelWhateverThatIs();
}

14行而不是35行(当然,提取的方法的主体会延长整个代码,但你可以看一下它并知道它在做什么)。值得做吗?这真的取决于你或后来的程序员是否更清楚。我的猜测是值得做的,将少量代码块拆分成自己的方法将使代码更容易维护。

答案 2 :(得分:1)

如果没有你的代码,建议实际修复有点困难,但它肯定听起来像是一个真正错误的方法,并且你做的事情比他们需要的更难:

  

3行设置变量   确定层次结构的“级别”   正在搜索数据

如果有搜索表单,我认为您希望将这些直接从params哈希传递到范围或Model.where()调用。根据需要在模型上设置范围。

  

根据子域是否在请求中填充一些视图变量的另外10行。

在我看来,它最多应该是1行。或者在您看来,您应该使用if语句根据您的子域更改您希望输出的内容。

  

基于以下内容重定向到两个页面之一的10行部分:

你对2个视图的解释唯一不同的是“用户是否已请求访问”当然这只是一个布尔变量?您只需要1个视图。将差异包装成2个部分然后在您的视图中并编写一个if语句以在它们之间进行选择。

  

另外10行构建动态arel。

可能有必要进入Arel,但我非常怀疑它。您的实际搜索呼叫在大多数情况下(并且应该是)1行,通过标准的ActiveRecord查询界面完成。您希望在模型中设置强大的范围,通过ActiveRecord查询界面来加入其他模型/缩小条件等。