dev/mom0tomo

技術メモ

Railsでパーシャルを切り出すときはインスタンス変数をローカル変数にする

new.html.erb

<h1>新規タスク作成</h1>

<%= form_for(@task) do |f| %>
  <% f.label :content, 'タスク' %>
  <% f.text_field :content %>
  <% f.submit '登録' %>
<% end %>

<%= link_to '一覧に戻る', tasks_path %> 

edit.html.erb

<h1>タスク編集画面</h1>
<p><%= @task.content %></p>

<%= form_for(@task) do |f| %>
  <% f.label :content, 'タスク' %>
  <% f.text_field :content %>
  <% f.submit '登録' %>
<% end %>

<%= link_to '一覧に戻る', tasks_path %> 

こういうのがあったときに、共通部分(フォーム周りのところ)をパーシャルにして切り出したい。

学んだこと

以下のようなパーシャルをつくる。

_form.html.erb

<%= form_for(task) do |f| %>
  <%= f.label :content, 'タスク' %>
  <%= f.text_field :content %>
  <%= f.submit '登録'%>
<% end %>

new.html.erb

<h1>新規タスク作成</h1>

<%= render 'form', task: @task %>

<%= link_to '一覧に戻る', tasks_path %> 

edit.html.erb

<h1>タスク編集画面</h1>
<p><%= @task.content %></p>

<%= render 'form', task: @task %>

<%= link_to '一覧に戻る', tasks_path %> 


ポイントは以下の通り。

  • パーシャルでは元のインスタンス変数 @taskをローカル変数 taskに変更している
  • new/editでは task: @taskとすることでパーシャルに対して変数を渡している
    • taskという変数名で @task の値を渡している
    • パーシャルにインスタンス変数を使わないことでより汎用的になる