ブログより要約を転載: http://konyu.hatenablog.com/entry/2015/05/26/184153
選定理由とか使い所はブログに記載
検証環境
- OS: MacOSX yosemite
- Ruby: 2.2.0
- Rails: Rails4.2.1
インストール
Gemfileに"active_decorator"を追加し、bundle install
gem "active_decorator"
Decoratorを自動生成
既存のモデルに対してDecoratorを生成する
> bin/rails g decorator user
create app/decorators/user_decorator.rb
invoke rspec
create spec/decorators/user_decorator_spec.rb
Decoratorの書き方
### Decoratorファイル
app/decocators/user_decorator.rb
module UserDecorator
# 共通処理を書きたい場合
# PeopleDecoratorモジュールをインポート
include PeopleDecorator
# 文字列だけの場合
def full_name_with_bracket
"[ #{first_name} #{last_name} ]"
end
# タグで囲んでクラスを付ける場合(1つのタグで囲む場合のみ)
# こういうのが出力できる<span class="class_name">John Doe</span>
def full_name_with_tag
content_tag :span, "#{first_name} #{last_name}", class: "class_name"
end
# 分岐もこのようにかける
def true_false_method
if first_name.present?
"I have first name."
else
"I don't have first name! Come on Daddy, please give me first name!!"
end
end
# partial パーシャルを表示する場合
def render_partial
render partial: "shared/xxxx"
end
end
複数のDecoratorに渡る共通処理
上記でインポートされるDecoratorはの作成、シンプルなモジュールで良い
app/decocators/people_decorator.rb
module PeopleDecorator
# 複数のdecoratorにまたがる共通処理
def full_name
"#{first_name} #{last_name}"
end
end
使えるViewHelperについて
他にもActionView::Helpersを使えるそうなのでRailsのビューヘルパー(View Helper)のまとめに乗っているものは使えるだろう
### specファイル
デコレートされたクラスを作成するために
Model名.extend Decoratorクラス名 でデコレートしてあげる
※ Decoratorの自動生成時にできるのでそれを真似ればよい
spec/decorators/user_decorator_spec.rb
require "rails_helper"
describe UserDecorator do
# ここがみそ
let(:user) { create(:user).extend UserDecorator }
subject { user }
it { should be_a User }
describe "full_name" do
subject { user.full_name }
it { is_expected.to eq "#{user.first_name} #{user.last_name}" }
end
end
### コントローラでの呼び出し
特に何もしなくて良い
### ビューファイルでの呼び出し方
以下の様な感じで、単純に呼んでやれば良い
Erbだとこんな感じ
<%= current_user.full_name_with_bracket %>
<%= current_user.full_name_with_tag %>
<%= current_user.full_name %>
<%= current_user.true_false_method %>
<%= current_user.render_partial %>