部分テンプレートとは
複数のビューファイルで共通する部分をテンプレート化する。そのまま!
例えば、ヘッダーやサイドバーなどはいくつかのビューで使い回せる可能性が高い。
つくりかた
_form.html.erb
<%= form_with model: thing do |form| %>
<%= form.text_field :name %>
<%= form.submit %>
<% end %>
①ファイル名を_から始める。
②共通する部分のみを記述。
呼び出し方
new.html.erb
<%= render partial: "form", locals: { thing: @thing } %>
edit.html.erb
<%= render partial: "form", locals: { thing: @thing } %>
新規登録画面と編集画面です。
form_withさんが自動的にcreateアクションかupdateアクションへ振り分けてくれるおかげで、どちらも同じ記述です。
注意点としては
①partial: のあとに部分テンプレート名を記述。その際は_を除く。
_form.html.erb → partial: "form"
②locals: のあとに部分テンプレート内で使う変数を定義する。
この場合、部分テンプレート内でthingを使っていることから、コントローラーから渡された@thingをthingに変更。
locals: { thing: @thing }
ちなみに、呼び出す際に部分テンプレートが同じフォルダ内にある時は①の記述で構いません。以下。
・ views
・ things
・ _form.html.erb
・ new.html.erb
・ edit.html.erb
<%= render partial: "form", locals: { thing: @thing } %>
しかし、以下のように部分テンプレートが別のフォルダに存在する場合は、
・ views
・ layouts
・ _form.html.erb
・ application.html.erb
・ things
・ new.html.erb
・ edit.html.erb
<%= render partial: "form/layouts", locals: { thing: @thing } %>
フォルダ名を/のあとに記述します。
また、partial,localsの省略も可能です。
<%= render "form/layouts", thing: @thing %>
ではまた!