Rails decoraterでviewをすっきりさせるメモ

<User id: 1, email: "test@example.com", first_name: "foo", last_name: "baa">

Userにfirst_name: foo, last_name: baaさんがいるとしてviewでフルネームを表示させようとすると

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

という感じで式展開しなくてはならない。モデルのインスタンスに対してもっと複雑な加工をしなくてはならないとするとよりコードが長くなり見づらくなる。

そこでModelとViewの中間にデータの加工の役割を担うものとして Draperを導入する。

gem 'draper'
$rails generate draper:install
$rails generate decorator User
#app/decoraters/user_decorater.rb
class UserDecorator < Draper::Decorator
 delegate_all

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

これでviewで

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

と書いていたものが

<%= @user.decorate.full_name %>

と書けるようになった。

#UserController
@user = User.first.decorate

コントローラーで上記のように書いておくとviewで.decorateを省略できる。

この記事が気に入ったらサポートをしてみませんか?