部分テンプレート
- 同じHTML構造の部分を共通化することによって、無駄なくビューファイルを作成する。
- 部分テンプレートのファイル名は必ずアンダーバー「_」から始まる。
(例)
tweets/index.html.erb
<div class="contents row">
<% @tweets.each do |tweet| %>
<div class="content_post" style="background-image: url(<%= tweet.image %>);">
#--------------ここから--------------
<div class="more">
<span><%= image_tag 'arrow_top.png' %></span>
<ul class="more_list">
<li>
<%= link_to "詳細", tweet_path(tweet.id), method: :get %>
</li>
<% if user_signed_in? && current_user.id == tweet.user_id %>
<li>
<%= link_to '編集', "/tweets/#{tweet.id}/edit", method: :get %>
</li>
<li>
<%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
</li>
<% end %>
</ul>
</div>
<%= simple_format(tweet.text) %>
<span class="name">
<a href="/users/<%= tweet.user_id %>">
<span>投稿者</span><%= tweet.user.nickname %>
</a>
</span>
</div>
#----------------ここまでを切り取り----------------------
<% end %>
<%= paginate(@tweets) %>
</div>
_tweet_html.erbを作成して切り取った部分を貼り付け
tweets/_tweet.html.erb
<div class="content_post" style="background-image: url(<%= tweet.image %>);">
<div class="more">
<span><%= image_tag 'arrow_top.png' %></span>
<ul class="more_list">
<li>
<%= link_to "詳細", tweet_path(tweet.id), method: :get %>
</li>
<% if user_signed_in? && current_user.id == tweet.user_id %>
<li>
<%= link_to '編集', "/tweets/#{tweet.id}/edit", method: :get %>
</li>
<li>
<%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
</li>
<% end %>
</ul>
</div>
<%= simple_format(tweet.text) %>
<span class="name">
<a href="/users/<%= tweet.user_id %>">
<span>投稿者</span><%= tweet.user.nickname %>
</a>
</span>
</div>
index.html.erbを以下のように編集
tweets/index.html.erb
<div class="contents row">
<% @tweets.each do |tweet| %>
<%= render partial: "tweet", locals: { tweet: tweet } %> #
<% end %>
<%= paginate(@tweets) %>
</div>
ここでのrenderメソッドのlocalsオプションに注目してみると{ tweet: tweet }
の右側の tweet
は__eachメソッド__内の変数としてのtweet
でtweet
のインスタンスを示している。一方、左側の tweet は部分テンプレート内での変数の名前を表している。