Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@kenkentarou

Decoratorの導入(gem draper)

More than 1 year has passed since last update.

デコレーターとは

ソフトウェアのデザインパターンの一つです。

viewとmodelの中間(プレゼンテーション層)の考え方で、既存の関数やクラスの中身を直接触ることなく、その外側から機能を追加したり書き換えたりすることができます。

Decoratorというデザインパターンを導入することで、viewにロジックを記述しないといったことができるので、可読性、保守性を向上させることができます。

Draper

DraperはRailsのviewとmodelの中間(プレゼンテーション層)の役割を担うgemです。

Draperはデコレーターであり、ビューとモデルの中間に位置し、モデルやビューに実装されやすい表示ロジック/フォーマットといったプレゼンテーション層の責務を引き受けます。

gem draperを使用し、decoratorを導入

gem 'draper'
→$ bundle install

ユーザーのフルネームを表示させるメソッドを定義してみる

  • user_decorator.rbを生成し、そこにユーザーのフルネームを返すメソッド、full_nameを定義してみます。
$ bundle exec rails generate draper:install

→application_decorator.rb生成

$ bundle exec rails generate decorator user

→user_decorater.rb生成

user_decorater.rbへメソッドを定義

user_decorater.rb
class UserDecorator < Draper::Decorator
  delegate_all

  def full_name
    "#{object.last_name} #{object.first_name}"
  end
end

view側での呼び出し

<%= current_user.decorate.full_name %>

余談

メソッドを作成する際にmodel controller helper decoratorなどのどこに作成すれば良いか、判断基準がわからない問題について、私はこのように考えています。

  • model
    基本的にはデータの更新、取得時の判定に関わる部分
    例: current_user.my_board?(board)

  • controller
    各アクションの前後に実行したい処理
    例: set_board, require_login

  • helper

    model, controller, viewなど全体で使いたいメソッドを定義する
    例: current_user
    呼び出される範囲が広いので、何でもhelperに記載するのはNG

  • decorator
    文言の表示をする際の処理やロジックを記載する
    データの更新を伴わないものが対象
    例: full_name

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kenkentarou
株式会社Relicで、webエンジニアやってます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?