Draper建议在控制器方法结束时装饰对象,或者使用decorates_associated
方法to automatically decorate them来装饰对象。
我喜欢视图的想法,明确声明它期望接收的内容(授予Rails的其余部分并不像这样工作,但它仍然感觉很好)。因此,我更喜欢在视图顶部而不是在控制器的末尾装饰对象:
所以在用户#show中我想做:
- @user = @user.decorate
%h1= @user.full_name
%p= @user.description
而不是在这样的用户控制器中进行装饰
class UsersController < ApplicationController
...
def show
@user = User.find(params[:id]
@user = @user.decorate
end
end
我怀疑这样做会有一些缓存问题,但感觉还不错。如果我遗失了怎么办?是我提出的不良做法?
答案 0 :(得分:2)
我认为这是一个非常好的问题,因为draper混淆了传统的MVC逻辑。正如您可以在已链接的draper README中阅读的那样,draper旨在用更结构化的方法替换混乱的帮助程序定义。
然而,M-V-C的哪一部分属于哪个? Draper声称装饰对象,它们可以与软件架构的表示部分相关联,因此既不属于 Model ,也不属于 Model 适合控制器。
根据@Damien Roche的评论,它也不适合 View ,因为人们通常不希望模板文件再执行对对象的操作比显示其属性。你也没有在模板中定义你的帮助,对吗?
在我看来,draper可以看作更像是一个中间件,它扩展了控制器在到达视图之前选择显示的对象。遵循该逻辑,我更喜欢使用decorate_assigned
命令,因为它将装饰以某种方式放置在 Controller和View之间。
补充说明:我知道你的意思是什么,宣布它想要接收的内容&#39;但这与事实相反,您通常会为整个应用程序定义每个模型一个装饰。因此,没有太多空间可以提出特殊要求&#39;