はじめに
部分テンプレート使用時に注意したい点を備忘録としてまとめます。
ActionView::Template::Error (Missing partial)の対応
エラー内容
mm/hoge/index.html.erb
<%= render 'registration' %>
ActionView::Template::Error (Missing partial mm/hoge/registration, base/fuga/registration, application/registration with {:locale=>[:ja, :en], :formats=>[:js, :html, :text, :css, :ics, :csv, :vcf, :vtt, :png, :jpeg, :gif, :bmp, :tiff, :svg, :mpeg, :mp3, :ogg, :m4a, :webm, :mp4, :otf, :ttf, :woff, :woff2, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :gzip], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. Searched in: ....
原因
- renderメソッドを書いたビューファイル「mm/hoge/index.html.erb」と部分テンプレート「mm/fuga/_registration.html.erb」が別のディレクトリにあるため
解決法
- app/views以下のパスを書く
- <%= render 'registration' %>
+ <%= render 'mm/fuga/registration' %>
以下の書き方はすべて同じファイルを呼び出す
- UsersControllerクラスのupdateアクション実行に失敗し、editテンプレートをレンダリングする場合
- すべてviews/usersディレクトリのedit.html.erbがレンダリングされる
render :edit
render action: :edit
render "edit"
render action: "edit"
render "users/edit"
render template: "users/edit"
partial
は省略可能だが、locals
などの追加オプションも渡す場合は省略できない
# 基本の使い方
render 'ファイル名', 部分テンプレートで使う変数: 変数に入れる値
# OK
render 'registration', user: @user, index: @index
render partial: 'registration', locals: { user: @user, index: @index }
# NG
render 'registration', locals: { user: @user, index: @index }
部分テンプレートファイル名のアンダースコア(_
)は呼び出し時は省略する
「_registration.html.erb」ファイルを呼び出す場合
render 'registration' # 同じディレクトリにある場合
render 'books/registration' # 別のディレクトリにある場合