Ruby on Rails DRY最佳实践

时间:2013-11-03 16:29:38

标签: ruby-on-rails ruby-on-rails-4 railstutorial.org

我通过Mickael Hartl的教程学习了RoR编程,我非常喜欢。

现在我正在开发一个包含8种对象的应用程序。

对于每个对象,我需要分配来自状态表的状态,并分配当前用户的名称。

在每个控制器的私有部分中,我编写了一个statuses_list函数和一个current_user_name,它们使这些数据可用于分别选择表单中的字段。

这听起来不像DRY那么多。 将这些函数编写为帮助程序是否相关且安全,以便数据在我的应用程序中的任何位置都可用?

感谢您的建议,

致以最诚挚的问候,

弗雷德里克

5 个答案:

答案 0 :(得分:1)

将这些方法移至其主类。 Status.list()User.current_user()。这通常是人们如何解决问题“每个人都需要current_user,但没有人想要$current_user全局变量。

然后在身份验证系统识别用户时,尽早在current_user中分配before_filter。阅读/自信的Ruby /,由Avdi Grimm撰写,关于创建Guest用户的方式和原因的非常好的报道,如果没有人登录,current_user将返回:{{3} }

答案 1 :(得分:1)

将方法放在帮助文件中是使它们在视图中可用的最佳方法,但是如果想要在控制器中使用这些方法,那么将这些方法作为方法放在{ {1}}并在顶部指定:

ApplicationController

希望有所帮助。

答案 2 :(得分:0)

我建议使用继承为某些控制器提供一些相同的方法。

创建一个扩展ApplicationController的SuperClass,如:

class SuperController < ApplicationController
    [...]
end

并将其子类化

class MyControllerClass < SuperController
    [...]
end

把重复的东西放在SuperController中 - 等等! MyControllerClass继承SuperController方法,所以你不需要重复它们。

答案 3 :(得分:0)

要在整个应用程序中访问您的代码,您必须在helpers中提及它。这是一个DRY原则,可以帮助您一次又一次地减少相同的代码行。

答案 4 :(得分:0)

好的,多亏了收集到的所有答案,我就是这样做的:

set_statuses_list

中定义了ParametersHelper方法

include ParamtersHelper添加到ApplicationController

在我的8个对象控制器中添加了before_action :set_statuses_list

感觉这是一个很好的平衡,我很乐意得到关于它的评论。 请注意current_user方法确实已通过SessionsHelper

提供

感谢您的帮助,

致以最诚挚的问候,

弗雷德里克