我通过Mickael Hartl的教程学习了RoR编程,我非常喜欢。
现在我正在开发一个包含8种对象的应用程序。
对于每个对象,我需要分配来自状态表的状态,并分配当前用户的名称。
在每个控制器的私有部分中,我编写了一个statuses_list函数和一个current_user_name,它们使这些数据可用于分别选择表单中的字段。
这听起来不像DRY那么多。 将这些函数编写为帮助程序是否相关且安全,以便数据在我的应用程序中的任何位置都可用?
感谢您的建议,
致以最诚挚的问候,
弗雷德里克
答案 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
。
感谢您的帮助,
致以最诚挚的问候,
弗雷德里克