1

Draper 建议在控制器方法的末尾装饰对象,或者使用它们的decorates_associated方法自动装饰它们

我喜欢视图明确声明它期望接收什么的想法(当然,Rails 的其余部分不能像这样工作,但它仍然感觉很好)。因此,我更喜欢在视图顶部而不是在控制器末尾装饰对象:

所以在 users#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

我怀疑以这种方式做事存在一些缓存问题,但感觉很好。如果我遗漏了什么怎么办?我建议的做法是不好的做法吗?

4

1 回答 1

2

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

但是,这属于 MVC 的哪一部分呢?Draper 声称可以装饰对象,这些对象可以与软件架构的表示部分相关联,因此既不属于Model也不真正适合Controller

在@Damien Roche 的评论之后,它也并不真正适合View,因为通常不希望模板文件对对象执行比显示其属性更多的操作。您也不要在模板中定义助手,对?

在我看来,draper 更像是一个中介,它在控制器选择显示的对象到达视图之前对其进行扩展。按照这个逻辑,我更喜欢使用decorate_assigned命令,因为它以某种方式将装饰放置控制器和视图之间。

补充说明:我知道“视图声明它想要接收的内容”是什么意思,但这与您通常为整个应用程序的每个模型定义一个装饰的事实形成对比。所以“特殊要求”的空间不大

于 2014-06-10T12:37:31.717 回答