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に新たな責務を追加することができます。