LoginSignup
28
29

More than 5 years have passed since last update.

Rails4 + Cells 4系 : ハマりポイントと回避策をまとめてみた。

Last updated at Posted at 2015-03-03

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
28
29
1

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
28
29