Ruby on rails 在视图开始时装饰对象(使用Draper)有什么不好的地方吗?

Ruby on rails 在视图开始时装饰对象(使用Draper)有什么不好的地方吗?,ruby-on-rails,draper,Ruby On Rails,Draper,Draper建议在控制器方法的末尾装饰对象,或者使用与其关联的装饰方法 我喜欢视图明确声明它期望接收的内容的想法(尽管Rails的其余部分不是这样工作的,但它仍然感觉不错)。因此,我更喜欢在视图顶部而不是控制器末端装饰对象: 所以在用户中#显示我想做的事: - @user = @user.decorate %h1= @user.full_name %p= @user.description 而不是像这样在用户控制器中进行装饰 class UsersController < Applic

Draper建议在控制器方法的末尾装饰对象,或者使用与其关联的
装饰方法

我喜欢视图明确声明它期望接收的内容的想法(尽管Rails的其余部分不是这样工作的,但它仍然感觉不错)。因此,我更喜欢在视图顶部而不是控制器末端装饰对象:

所以在用户中#显示我想做的事

- @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
class UsersController

我怀疑这样做可能会有一些缓存问题,但感觉不错。如果我遗漏了什么呢?我提出的是不好的做法吗?

我认为这是一个很好的问题,因为draper有点混淆了传统的MVC逻辑。正如您在链接的draper自述中看到的,draper旨在取代clutte使用更结构化的方法定义红色辅助对象

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

在@Damien Roche的评论之后,它实际上也不适合视图,因为人们通常不希望模板文件对对象执行比显示其属性更多的操作。您也不在模板中定义帮助程序,对吗

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


附加说明:我知道你所说的“视图声明它想要接收的内容”是什么意思,但这与你通常为整个应用程序为每个模型定义一个装饰的事实形成了鲜明的对比。因此没有太多的空间来满足“特殊要求”

这取决于。约定很重要,特别是当其他开发人员Loper在相同的代码库上工作(现在或将来)。作为一名开发人员,我希望对象在控制器中进行装饰。同样,如果您使用的是使用
draper
的现有应用程序,您也应该期待同样的事情。这会减少读取代码的精力,这也是为什么在大多数情况下都应该遵循约定的原因。这并不是“声明它期望收到的内容”,这是“修改它接收到的内容”。在我看来,这与“愚蠢的观点”背道而驰气质。视图是给定的数据,设置这些数据是动作的工作。这在控制器代码中是误导性的,因为离开控制器的不是视图中正在操作的东西。@DamienRoche我完全同意你的约定观点,仅此一点就是遵守规范的一个很好的理由。Dave Newton你也是对的,但我想我是对的我从来没有真正接受过dumb views范例。我不知道为什么一个视图不会声明它的依赖项,尽管你说这是Rails规范。在视图中进行装饰也不会声明这些依赖项,但至少它暗示了需要什么。我不确定我是否得到了你的最后一点Peter-每个模型的一个装饰。我喜欢但你的逻辑是这样的。我对装饰器的看法是,它们实际上是名称空间的帮助器。我讨厌帮助器,并尽量避免使用对象特定的帮助器,因为我发现它们是一堆奇怪的方法。也许我应该更努力地使用Draper
decoration\u关联的
,看看这能让我走多远:)@PeterNixey我最后一点的意思是,您通常不会为单个模型的每个视图定义不同的装饰类,对吗?因此,在每个视图中重复调用
.decoration
都不是很枯燥。关于Helper vs Draper点:正确使用Helper时,Helper也是有名称空间的。我认为draper更像是一个面向对象的视图,而helpers则是一种功能性的方法。好吧,我明白你说的干燥是什么意思了。我没有做到这一点,因为我一直在手动装饰每个控制器方法的末尾,这肯定是次优的。出于兴趣,您将如何选择命名空间助手?我从来没有真正做到这一点,助手是按模块组织的,尽管这不是rails>=3的默认行为,但您可以告诉rails不要包括所有控制器的所有助手,而只包括与控制器名称匹配的助手(例如
UsersHelper
用于
userscocontroller
)(请参阅:)这至少是控制器方面的名称空间,我认为这很好。但是,我还是更喜欢draper的面向对象方法,而不是helpers的函数方法