这是一个新的应用程序,我在Search控制器上有一个索引方法。这也是应用程序的主页,我正在尝试从设计模式的角度来决定我是否走错了路。
该方法已经有35行。这是方法的作用:
3行设置变量,用于确定正在搜索分层数据的“级别”。
根据子域是否在请求中填充一些视图变量的另外10行。
基于以下内容重定向到两个页面之一的10行部分:
1)如果用户无权访问,并且已登录且尚未请求访问权限,请告诉他们“点击此处请求访问此品牌”。
2)如果用户没有访问权限,已登录并已请求访问权限,请告诉他们“正在审核您的请求”。
另外10行构建动态arel。
我无法直接理解如何区分这些问题,或者即使它们应该分开。感谢您提供的任何帮助!
答案 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查询界面来加入其他模型/缩小条件等。