draperを使ってviewに書いてしまったロジックを減らす

view側に表示するためにデータを整形するロジックを書いてしまうことなどあると思います。
そういう場合helperを使うというのも一つ手ではありますが、最近ではpresenterという層を設けてviewからそういったロジック部分を取り除くやり方が主流となって来ています。

railsではそういった時に使うフレームワークとしてActiveDecoratorなどありますが、今回はdraperです。

1.Gemfileに追加してbundle install

gem 'draper'

2.ファイルを生成。今回はmovieというモデルに対するpresenterを作る


bundle exec rails g decorator movie

3.生成されたファイルにメソッドを追加。簡単な例として日付の表示フォーマットを変えるものを追加する

class MovieDecorator < Draper::Decorator
  delegate_all

  # Define presentation-specific methods here. Helpers are accessed through
  # `helpers` (aka `h`). You can override attributes, for example:
  #
  #   def created_at
  #     helpers.content_tag :span, class: 'time' do
  #       object.created_at.strftime("%a %m/%d/%y")
  #     end
  #   end
  def created_at
    movie.created_at.strftime("%y-%m-%d %H:%M")
  end
end

4.コントローラでこのMovieDecoratorを使うように変更する
今回は詳細表示の画面

def show
  @movie = MovieDecorator.find(params[:id])
end

これでshow.html.erbの中では単に@movie.created_atとするだけで整形された日付が表示されます