11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ActiveDecoratorでビューからロジックを切り離せ(要約版)

Last updated at Posted at 2015-05-26

ブログより要約を転載: 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 %>
refs:
11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?