在模型中调用ActionText是不好的形式?

时间:2010-02-16 21:06:59

标签: ruby-on-rails

从ActiveRecord中调用ActionText是否可以接受?

def last_updated
  updated_at? ? "Updated #{ActionText::time_ago_in_words(updated_at)} ago" : "never updated"
end

有没有反对做这样的事情的论据?这应该是帮助方法吗?

2 个答案:

答案 0 :(得分:1)

是。根据严格的MVC教导,它是一种糟糕的形式,属于帮手。

理论上:这个特定的功能块是特定于表示的,因此通过MVC教导它属于视图助手。

在实践中:这没关系。我相信在加载服务器/控制台时会解析ActionText。这意味着不需要再次加载该文件。从内存管理方面来看,也可以直接调用方法而不是包含ActionText。

没有任何机构会阻止您将此代码添加到模型中或强迫您执行正确方法

我个人更喜欢在模型中定义这些类型的方法,因为我发现实例方法(model.last_updated)的语法比助手(last_updated(model))更具美学吸引力。然而,ruby的动态特性允许你两种方式都有它。基本上在模型上定义仅在视图中可用的实例方法。它所需要的只是一个额外的步骤。

如果您真的对这一额外步骤感兴趣,它将如下所示:

module ModelHelper 
  def included(base)
    Model.send(:include, ModelInstanceMethods)
  end

  module ModelInstanceMethods
    def last_updated
      updated_at? ? "Updated #{ActionText::time_ago_in_words(updated_at)} ago" : "never updated"
    end
  end
end

其中Model是模型的类名,您希望此方法成为其中的一部分。

答案 1 :(得分:0)

我建议把它放在帮助器而不是模型中。似乎这个方法将用于为视图生成内容,这正是帮助程序的用途。