从ActiveRecord内部调用ActionText可以接受吗?
def last_updated
updated_at? ? "Updated #{ActionText::time_ago_in_words(updated_at)} ago" : "never updated"
end有反对这样做的理由吗?这应该是帮助器方法吗?
发布于 2010-02-17 06:05:10
是。根据严格的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是您希望此方法作为其一部分的模型的类名。
发布于 2010-02-17 11:36:56
我建议将其放在帮助器中,而不是放在模型中。这个方法似乎可以用来为视图生成内容,而这正是帮助程序的作用。
https://stackoverflow.com/questions/2276346
复制相似问题