在帮助器中使用模型是否“正确”?

时间:2014-01-22 08:49:24

标签: ruby-on-rails

我最近一直在为新项目使用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

我应该在帮助程序类中使用模型吗?

3 个答案:

答案 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