在视图的开头装饰对象(使用Draper)有什么不好吗?

时间:2014-06-10 11:04:00

标签: ruby-on-rails draper

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

我怀疑这样做会有一些缓存问题,但感觉还不错。如果我遗失了怎么办?是我提出的不良做法?

1 个答案:

答案 0 :(得分:2)

我认为这是一个非常好的问题,因为draper混淆了传统的MVC逻辑。正如您可以在已链接的draper README中阅读的那样,draper旨在用更结构化的方法替换混乱的帮助程序定义。

然而,M-V-C的哪一部分属于哪个? Draper声称​​装饰对象,它们可以与软件架构的表示部分相关联,因此既不属于 Model ,也不属于 Model 适合控制器

根据@Damien Roche的评论,它也不适合 View ,因为人们通常不希望模板文件再执行对对象的操作比显示其属性。你也没有在模板中定义你的帮助,对吗?

在我看来,draper可以看作更像是一个中间件,它扩展了控制器在到达视图之前选择显示的对象。遵循该逻辑,我更喜欢使用decorate_assigned命令,因为它将装饰以某种方式放置在 Controller和View之间。

补充说明:我知道你的意思是什么,宣布它想要接收的内容&#39;但这与事实相反,您通常会为整个应用程序定义每个模型一个装饰。因此,没有太多空间可以提出特殊要求&#39;