カテゴリー:
Rails
タグ:
 Rails partial lookup_context

このエントリーをはてなブックマークに追加
更新日時:
2013年06月01日(土)
作成日時:
2013年04月16日(火)

前の記事 / 次の記事

Railsでpartialの有無を調べるだと例外が発生した時のケースを考えるのがだるいので
lookup_context を使った処理についてメモ。

lookup_context.exist?(テンプレート名, プレフィックス, テンプレートがパーシャルかどうか)

引数の詳細など詳しくはActionView::LookupContext::ViewPathsを参照。
プレフィックスは階層を掘っていない場合ビューに対応するコントローラー名と同じになるはず。

テンプレートがパーシャルである場合 (第3引数に true)

lookup_context.exist?(_form, "articles", true)
#=> パーシャルが存在していれば true

テンプレートがパーシャルではない場合 (第3引数に false)

lookup_context.exist?(new, "articles", false)
#=> テンプレートが存在していれば true
# デフォルトでfalseなのでパーシャルではなければ特に書かなくてもいい。

で、ヘルパーに

def render_any(partial, options)
  prefix = options.delete(:prefix) || controller_name
  if lookup_context.exists?(partial, prefix, true)
    render(partial, options)
  else
    render(options.delete(:default), options)
  end
end

とか書いて、ビューで

render_any("form", default: "articles/form")

いまいちだったので改修(2013/06/01)

パーシャルの配列を渡し、一番最初にヒットしたパーシャルをレンダリングする。

パーシャルに "/" が含まれていれば app/views 以下からパーシャルを検索、
パーシャルに "/" が含まれていなければそのコントローラーに対応するビューのパス内から検索。

controller._prefixes はそのコントローラーに対応するビューのパスを取得する。

render("partial") する場合はパーシャルに "/" が含まれていなければ、
自動的にそのコントローラーに対応するビューのパス内からパーシャルを検索するが、

look_up_context.exists? の場合は、
明示的にそのコントローラーに対応するビューのパスをprefixとして指定しないとそうならない。

def render_any(partials, options)

  partial = partials.find do |partial|
    prefix = partial.include?("/") ? "" : controller._prefixes
    lookup_context.exists?(partial, prefix,  true)
  end

  render partial, options
end

で、ビューで

render_any %w(form articles/form)

参考