酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Cells - Railsの部分テンプレートとそのロジックを分離するコンポーネントフレームワーク

Cells』はRailsの部分テンプレートに付随するロジックをコントローラから分離するためのコンポーネント・フレームワークの紹介です。

Rubyist Magazine - Ruby on Rails: The Bad PartsでもRailsの良くないコーティングスタイルを改善するための仕組みとしてCellsの活用が提案されています!


Gemのインストール

Gemfileに以下を追加して、コンソールでbundleを実行してください。

1
2
# 部分テンプレートのロジック分離
gem 'cells'

Cellsのファイルの生成

ここでは、カート(cart)を表示(show)する部分テンプレートをhamlで作成してみます。

1
2
3
4
5
6
rails generate cell cart show -e haml
  create  app/cells/
  create  app/cells/cart
  create  app/cells/cart_cell.rb
  create  app/cells/cart/show.html.haml
  create  test/cells/cart_test.rb

Cellsのrenderについて

app/cells/cart/show.html.hamlを部分テンプレートとして表示させたい箇所に以下を記述します。

1
= render_cell :cart, :show, :user => @current_user

:user => @current_userは外部から変数をCellsのメソッドに渡しています。

Cellのコントローラ的メソッドについて

続いて、先ほどのテンプレートのコントローラ的なメソッド、app/cells/cart_cell.rbを編集します。

1
2
3
4
5
6
7
8
class CartCell < Cell::Rails
  def show(args)
    user    = args[:user]
    @items  = user.items_in_cart

    render
  end
end

argsが、先程の:user => @current_userで受け取った変数の受け渡しを行なっています。

rendershow.html.hamlを描写するための記述です。

Cellのビューについて

さらにCellのビュー、app/cells/cart/show.html.hamlについてです。

1
2
#cart
  カートには、#{@items.size}件の商品が入っています。

ここでは@itemsの件数を表示しています。

Helperメソッドを使いたい場合

Helperメソッドを使いたい場合は、コントローラ的メソッドの部分に以下を記述。

1
2
class CartCell < Cell::Rails
  helper MyExtraHelper

Cellの部分テンプレートを使いたい場合

Cells内部で部分テンプレートを使いたい場合は、以下のように記述。

1
2
%p
  = render :view => 'items'

Rails側の部分テンプレートを使いたい場合

Cellsの外部に設置している部分テンプレートを使いたい場合は、ビューへのパスを追記。

1
2
class MapCell < Cell::Rails
  append_view_path "app/views"

キャッシュを使う

Cells内でキャッシュを適用したい場合は、次のように書いて下さい。

1
2
class CartCell < Cell::Rails
  cache :show, :expires_in => 10.minutes

これでshowは10分間キャッシュされるようになります。

適切に使いこなせばコードの可読性を向上させることができそうです!

公式サイト

CellsのGitHubはこちら。英語ですがわかりやすいのでオススメです。

apotonick/cells · GitHub

おすすめの書籍