LoginSignup
37
17

More than 1 year has passed since last update.

【Rails】decoraterの使い方

Posted at

decoraterとは

Decoratorというデザインパターンを導入することで、ビューファイルにロジックを記述しないことが出来る。

使用イメージとしてはModelとViewの中間にデータの加工の役割を担うもの。これらを使えるようにするため、gemをインストールする。

Draper導入

まず最初にgemをインストール。

#Gemfile
gem 'draper'

$ budle install

次にセットアップ。

# app/decorators/application_decorator.rb を作成
# ApplicationDecoratorは全てのDecoratorの親クラスになる
$ rails generate draper:install

Draper使用例

データベースにfirst_name: "田中", last_name: "太郎"という名をviewにてフルネームで表示させようとすると、以下のようになる。

<%= "#{@user.first_name} #{@user.last_name}" %>

もしこれに複雑な加工を追加でする場合、コードが見づらくなってしまう。
そこでDraperでコードを見やすくする。

$rails g decorator User
このコマンドでuser_decorater.rbを作成

以下ファイルにfull_nameを定義。

user_decorater.rb
class UserDecorator < Draper::Decorator
 delegate_all

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

この処理をするとviewにて@user.decorate.full_nameと記載できるようになる。

<%= "#{@user.first_name} #{@user.last_name}" %>
                                           ↓
<%= @user.decorate.full_name %>

もし.decorateを毎回書くのが面倒なのであれば、コントローラーに下記を加えると省略できる。

users_controller.rb
@user = User.first.decorate

model、helper、moduleで記載しない理由

◆model
何でもモデルに記載しておくと、すぐにモデルは肥大化してしまうため。
モデルにはDBにアクセスするような処理のみを記載することで肥大化を防ぐ。

◆helper
helperもDecoratorもビューを書きやすくするための仕組みという点では共通点がある。しかし2つの違いとして
・helperはモデルから独立し直接関係していない描画ロジックを実装するのに用いる。
・Decoratorは特定のモデルに関連した描画ロジックを実装するのに用いる。

◆module
moduleで拡張用のメソッドを定義して、モデルのクラスにincludeすれば同じことを再現できるが、これもモデルに記載しているのとあまり変わらない。

もし1人で開発している場合であれば、モジュールがviewのロジック・モデルにはDBのアクセス…というルールのもとで実装できるかもしれないが、

共同開発の場合にはそのルールを共有していない場合、モデルにビューロジックが溢れ出すこととなりやすいためあまりお勧めできない。

参考記事

Rails decoraterでviewをすっきりさせるメモ
Decoratorの役割とDraperについて
Draperの使い方 まとめ

37
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
17