1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Decoratorをrailsに導入する

Posted at

Decoratorの説明の前に例え話から。
Modelでは日時を”2018-07-12 18:12:34”という値で保持していますが、Viewでは”2018/7/12”と表示したい場合を考える。
前提としてモデルはデータの格納に関する情報だけを書くところ。ビューは情報を表示する役割だけを担うべき。じゃあ上の”2018-07-12 18:12:34”を”2018/7/12”に変える処理はビューとモデルのどちらに書くべきか?

正解はビューとモデルのどちらでもなくDecoraterに書くべき。

話が遅くなったがDecoraterとは名前の通りデコレーターで、情報を加工する処理を書き込む。
それはビューとモデルの間に置く。

Decoraterを実装する

Decoraterを実装するにはDraperというgemを使う。

gem 'draper'

bundle installを実行。

###Decoraterを使って置き換えを行う。

1、decoratorのメソッドを定義するファイルを作成する。

以下のコマンドである。

rails g decorator モデル名

userとしたのはモデル名である。今回はlast_nameとfirst_nameというuserモデルのカラムを扱うので、モデル名はuserとする。

2,作成したdecorator.rbにメソッドを定義する。

今回はuserモデルのlast_nameとfirst_nameを結合してフルネームを返すfull_nameメソッドを定義する。

class UserDecorator < Draper::Decorator
  delegate_all

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

これでuserインスタンスに対してメソッドが使えるようになるが、注意点が一つある。

3,実際にビューファイルに出力してみる。
<%= current_user.decorate.fullname %>

定義したfull_nameメソッドを使用するには上記のようにdecorateメソッドを経由しなければいけない!

以上。

[補足]Decoratorを使う場所

・コントローラー → ×
表示に関わるファイルでのみ使用するので。(showアクションなどでフルネームを表示したい場合だったら使う。)

・ビュー → ○
表示に関わるファイルでのみ使用するので。

・モデル → ×
表示に関わるファイルでのみ使用するので!!!
(今回みたいにモデル内でフルネームを扱いたい場合は、モデル内でfull_nameメソッドを定義すれば良い)

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?