Decoratorとは?

Railsでは責務を分割することによって、可読性、保守性の高いアプリケーションを作ることができます。helperにはビュー表示の責務を持たせ、modelには対象リソースに関する処理を責務として持たせます。
そのなかで、Decoratorにはhelperとmodelの中間のような責務を持たせます。モデルの内容を少し加工してビューに表示させる場合(model には表示に関する責務を持たせたくない、viewには表示に関するコード以外は書きたくない)などは、helperやmodelではなくDecoratorにコードを記述します。

active_decoratorをインストー

gem 'active_decorator'

$ bundle install

decoratorファイルを作成

$ rails g decorator question
‘app/decorators/question_decorator.rb'というファイルが作成されます。
ファイル名は対象のモデルに合わせてください。

module QuestionDecorator
  # 3日後の日付を返すメソッドを定義します。
  def three_days_later
    self.updated_at.since(3.days)
  end
end

3日後の日付を返すことに意味があるのか?ビューでsince(3.days)を使ってもいいのでは? そこらへんはひとまず置いておきます。

ビューから呼び出す

<% @questions.each do |question| %>
  <%= question.three_days_later %>
<% end %>

このようにDecoratorを使うことで、Railsに新たな責務を追加することができます。