cells とは
cells は、controller と view をパッケージングしてまとめるための gem です。cells を利用することで、関連の強い controller内の処理 と view をパッケージングすることができ、再利用性やコードの見通しがよくなります。
例えば、ポップアップ画面やサイドバーを実装するときに有効です。cells の利用シーンについては、以下の記事が詳しいです。
http://qiita.com/hanzochang/items/374c31d026d55d0b49f0
cells3.x と cells4.x の違い
cells は 3.x と 4.x があるのですが、これらは大きく異なります。4.x では ActionView の機能を include するのをやめています。結果、描画速度が向上しています。しかし、一方で、ActionView の便利な機能がデフォルトでは使えなくなっています。
cells4.x でハマった点まとめ
ActionView を切った結果、cells4.x にはけっこうハマりポイントがあります。以下の点でハマりました... けっこうハマりました。そこで私と同じ苦労をする人が減るように、ハマった点をカバーできる application_cell.rb を公開します。
- devise の helper が使えない
- image_path が使えない
- form_for が使えない
- fields_for が使えない
- i18n が使えない
- flash が使えない
cells/application_cell.rb
class ApplicationCell < Cell::ViewModel
# 独自の helper
include ApplicationHelper
# 認証系 のhelper
include DeviseHelper
# gem の helper
include FontAwesome::Rails::IconHelper
include BreadcrumbsOnRails::ControllerMixin::HelperMethods
include LazyHighCharts::LayoutHelper
# asset 関連(image_path)
include ActionView::Helpers::AssetUrlHelper
include Sprockets::Rails::Helper
## asset の探索範囲を指定
self.assets_prefix = Rails.application.config.assets.prefix
self.assets_environment = Rails.application.assets
## asset に digest が付与されるようにする
self.digest_assets = Rails.application.config.assets[:digest]
# form 関連
include ActionView::RecordIdentifier
include ActionView::Helpers::FormHelper
include ActionView::Helpers::FormOptionsHelper
## form_for の内部で利用しているため include
String.send :include, ActionView::Helpers::TextHelper
String.send :include, ActionView::Context
## form_for の返り値が escape されてしまうので override
def form_for(model, options, &block)
raw(super)
end
## fields_for の返り値が escape されてしまうので override
def fields_for(model, &block)
raw(super)
end
# i18n 関連
include ActionView::Helpers::TranslationHelper
def scope_key_by_partial(key)
if key.to_s.first=="."
"cells.#{self.class.to_s.underscore}#{key}"
else
key
end
end
# model が複数の場合のエイリアス
def models
model
end
# flash にアクセスできるように
def flash
parent_controller.flash
end
end