Help us understand the problem. What is going on with this article?

Decoratorの導入(gem draper)

デコレーターとは

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

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

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした