Le Blog du Geek Joyeux

Plus moins vite tu codes, moins plus vite ça plante

Utilisation avancée de Draper

| Commentaires

Dans l’article précédent, je présentais Draper.

Dans cet articles j’ajouterai quelques trucs et astuces pour utiliser Draper de façon un peu plus avancée.

TL;DR

Utilisez decorate_association :comments dans ArticleDecorator pour décorer automatiquement les commentaires d’un article.

Incluez Draper::ModelSupport dans vos modèles pour les décorer en utilisant la syntaxe article.decorate.

Décorer les associations

Mettons que vous avez les modèles suivants:

1
2
3
4
5
6
7
8
9
class Article < ActiveRecord::Base
  attr_accessible :title, :body
  has_many :comments
end

class Comment < ActiveRecord::Base
  attr_accessible :author_name, :body
  belongs_to :article
end

Ces modèles sont décorés par les décorateurs suivants:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ArticleDecorator < ApplicationDecorator
  decorates :article

  def dashed_title
    "--#{model.title}--"
  end
end

class CommentDecorator < ApplicationDecorator
  decorates :comment

  def dashed_author_name
    "--#{model.author_name}--"
  end
end

Le souci est que lorsque l’on récupère un modèle décoré, les modèles qui lui sont associés ne sont pas décorés.

1
2
3
4
5
6
7
8
article = ArticleDecorator.decorate Article.first
article.title        #=> Hello World
article.dashed_title #=> --Hello World--

comment = article.comments.first
comment.author_name #=> John Doe
comment.dashed_author_name
NoMethodError: undefined method `dashed_author_name' for #<Comment:...>

L’astuce pour régler ce problème est d’indiquer à ArticleDecorator qu’il doit décorer ses commentaires:

1
2
3
4
class ArticleDecorator < ApplicationDecorator
  decorates :article
  decorates_association :comments
end

L’appel à dashed_author_name fonctionne maintenant normalement:

1
2
3
comment = article.comments.first
comment.author_name        #=> John Doe
comment.dashed_author_name #=> --John Doe--

Simplifier la décoration des modèles

Certains considèrent la syntaxe de décoration un peu trop longue à leur goût. Voici une façon de la simplifier.

Il vous suffit d’inclure le module Draper::ModelSupport dans vos modèles:

1
2
3
4
5
class Article < ActiveRecord::Base
  include Draper::ModelSupport

  # ...
end

Vous pouvez maintenant décorer votre modèle de la manière suivante:

1
article = Article.first.decorate

Commentaires