[Rails]Cells – partialをcontrollerとview共にまとめるGem


[Rails]Cells – partialをcontrollerとview共にまとめるGem

こんにちは。
heathrow ディレクターの半澤です。

Railsでviewを作成する際、
部分テンプレートとして
partialメソッドを利用しない日はないでしょう。

ですが、このpartial、あくまでビューに特化した機能なので、
ロジックをwrapして部分テンプレート化しようとすると、
非常に煩雑になります。

以下に想定される利用シーンと
cellを利用した解決策を紹介していきます。

Cellsの利用シーンの具体例

  • ログインポップアップ
  • サイドメニューのランキング表示
    など、全てのページでよく使われる部分パーツなどが
    具体的な利用シーンで上げられます。

たとえばログインポップアップで言うと、
以下のようなpartialを使いますね。

haml:dashboard.html.haml

上記コードは** dashboard以外にも、あらゆるページに存在している**という前提で読んでください。

で、partialのpopup_loginの中身は以下。

haml:_popup_login.html.haml

といった感じ。’ログインする’というリンクをクリックすると、
jsで上記のポップアップが出現するという仕組みです。(cssの記述はここでは省きます。)

ここで問題が。
haml:_popup_login.html.haml内の@userを、どこで生成するのか、という問題です。

コントローラで@userに関する記述を書かないと上記エラーが発生します。
ではこれを書くのは、applicationコントローラー?
まさかまさかの毎回それぞれのページにactionごとに設定する?(いやいやいや!ナシっしょ)

applicationコントローラに書いた場合(やらない方がいい例)

愚直に考えると…
ruby:app/controller/application_controller.rb にて

か。
ただ、今回はログイン周りだけのため簡素だが、
例えばランキング機能とか、サイトコメント機能?とか増えていくと、
ここが肥大していく。

また、通常のrailsのようにactionとviewの関連がわからず、
ぱっと見viewと関連が「疎」なため管理しづらい。

また、後々@userを読みたくないページがあるんだけどとかの場合、
そのページでbefore_actionをexpectしなくちゃいけないとかになってくると、
全てのコントローラーでこのメソッドを意識してロードしなくちゃいけないとか
結構めんどくなる。

ここででる本音は、viewとロジック(controller)をワンセットでパッケージ化してくれると
便利なんだどなぁという心の声。

そしたらありました、便利なGemが。
それがCellsです。

Cellsとは。

例えばさっきのhaml:dashboard.html.hamlのコード。

がありましたが↓

ってな感じで書くことで、
ロジックとviewをセットで読みだしてくれるという便利Gem。

render_cellした:popup_loginがどうなっているかというと
こんな感じに設置されたshow.html.hamlpopup_login_cell.rbがワンセットになって
呼び出されます。

ディレクトリは以下

haml:app/cells/popup_login_cell.rb

haml:app/cells/popup_login/show.html.haml

といった具合です。読出元のdashboard.html.hamlでは、
render_cellsメソッドを使うだけ。
コントローラーとviewを一緒くたに読みだしてくれます。

Cells導入方法

gemfileに書いて

bundle installして

generateします。

-e hamlでerbではなくhamlで書きだしてくれます。

cellsの部分テンプレートを読み出す場合は

といった感じです。

公式サイト

helper等より詳細な設定は下記をご参考ください。

github : apotonick/cells
https://github.com/apotonick/cells

と、久々の投稿の半澤でした。

この記事に対してコメントを書く