【问题标题】:How to include draper decorator in associated objects如何在关联对象中包含 draper 装饰器
【发布时间】:2013-07-08 07:31:01
【问题描述】:

我正在使用 Draper 向多个模型添加装饰器,我有一些用于一个模型(我的文档模型)的装饰器,我想用它们来“装饰”另一个模型(我的用户模型)。我怎样才能做到这一点?

我尝试将它放入我的文档装饰器中,但它不起作用。

decorates_association :user

**[decorators here]**

class UserDecorator < ApplicationDecorator
  decorates :user
end

并将其添加到我的用户控制器中:

def show
  @user = UserDecorator.find(params[:id])
end

提前谢谢你!

【问题讨论】:

    标签: ruby-on-rails model decorator draper


    【解决方案1】:

    看起来您已经设置了 ApplicationDecorator。如果您有想要在模型之间共享的装饰器方法,可以将它们包含在 ApplicationDecorator 中,如下所示:

    class ApplicationDecorator < Draper::Decorator
      def name
        model.name
      end
    
      def created
        model.created_at.strftime("%m/%d/%Y")
      end
    end
    

    如果你像这样设置你的 UserDecorator 和 DocumentDecorator:

    class UserDecorator < ApplicationDecorator
      delegate_all
    end
    
    class DocumentDecorator < ApplicationDecorator
      delegate_all
    end
    

    然后,ApplicationDecorator 中定义的任何装饰器方法(名称、创建等)将可用于装饰用户和装饰文档。

    我们有几个项目使用类似的设置在多个模型之间共享装饰器方法,以获取日期和时间格式、状态等常见属性。希望这会有所帮助。

    【讨论】:

    • 有什么方法可以共享,比如说,仅 5 个模型之间的 3 个方法,但不与其余模型共享这些方法?在这种情况下使用ApplicationDecorator 是不适用的。有没有像 concern 这样的装饰器?
    【解决方案2】:

    您不想与之共享逻辑的其他模型可以直接从 Draper::Decorator 继承,而不是从 ApplicationDecorator。 只有 5 个模型应该继承自 ApplicationDecorator

    @kovpack

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多