我最近一直在为新项目使用rails,并试图尽可能保持组织。人们说你不应该做的事情之一就是在视图中直接使用模型。
但是我有各种各样的项目列表需要被拉入视图中,如果有很长的实例变量列表似乎毫无意义:
@admin_list = User.all.map {|x| {id: x.id, name:x.name}}
所以我把上面的内容放到了辅助方法中:
def admin_user_list
User.all.map {|x| {id: x.id, name:x.name}}
end
我应该在帮助程序类中使用模型吗?
答案 0 :(得分:3)
这是一个非常自以为是的问题,但我个人将其定义为User类的类方法,并将其称为User.admin_list
另一方面,您应该问自己,实际上是否需要将对象映射到哈希,就像您正在做的那样。
答案 1 :(得分:1)
是的,没关系,但如果您发现自己使用大量方法作为帮助者,请考虑将它们组织成一个单独的类,作为“演示者”类或“计算”类。如果您确定了应用程序所处的位置,请继续执行此操作。
无论哪种方式,你都是正确的,因为在定义实例变量时不应该使用map这样的方法。 (我相信它在控制器中被定义为这样?)
无论如何,如果你想做你在上面指定的内容,
def admin_user_list
User.all.map {|x| {id: x.id, name:x.name}}
end
应该是(在用户模型下):
def self.admin_user_list
all.map {|x| {id: x.id, name:x.name}}
end
否则你会打电话
user = User.find(1)
user.admin_user_list,除非有用户特定的管理员列表,否则没有意义,在这种情况下我会收回我的陈述。
单独一个类的示例:
class Admin
def user_list
User.all.map {|x| {id: x.id, name:x.name}}
end
@admin_list = Admin.user_list
答案 2 :(得分:0)
您应该避免在帮助程序类中使用模型。 你可以做两件事.... 1.)首先,您可以使用模型类方法并按照Niels B的建议调用User.admin_list,但我不建议使用它,因为它需要在视图代码中提及模型类名称User。
2。)你应该在控制器中编写一个方法并声明它作为一个辅助方法,这将允许你直接调用helper方法而不提及模型类名。类似于...... ...
class ApplicationController < ActionController::Base
helper_method :admin_list
def admin_list
User.all.map {|x| {id: x.id, name:x.name}}
end
end