renderの繰り返し表示

renderを使っていて、<%= render 'comments/comments', { comments: @comments } %>という記載方法がありました。

 

なんだこれ!と思ったので、勉強した内容をアウトプットしていきます。

読者の皆様に少しでも参考になれば幸いです。

 

 

実装内容

掲示板に対し、連続したコメントを作成する。

boards(掲示板)モデルとcommentsモデルを1:多の関係で紐付けしています。

 

コメントエリアの作成

views/boards/show.html.erb

<!-- コメントエリア -->
<%= render 'comments/comments', { comments: @comments } %>

'comments/comments'は、commentsファイルにある_comments.html.erbという部分テンプレートを呼び出しています。

 

{ comments: @comments }は、部分テンプレートであるviews/comments/_comment.html.erb内でcommentという変数を使っているのでこのように記載します。

 

※views/boards/show.html.erb内でcommentsと複数形で定義してます。これには理由があるので、後ほど説明いたします。

 

partial

部分テンプレートを呼び出す時にはpartialを使って、<%= render partial: 'comments/comments' %>と記載できますが、呼び出している部分テンプレートを強調しているものなので、省略しても構いません。

しかしlocalオプションを使用している時は、partialを付けないとエラーになってしまうので注意してください。

 

 

views/comments/_coomments.html.erb

<div class="row">
<div class="col-lg-8 offset-lg-2">
<table id="js-table-comment" class="table">
<%= render comments %>
</table>
</div>
</div>

ここでrenderの呼び出しがcommentsとなっています。これは、render commentsの複数形でcommentパーシャルをコメントの件数分eachして表示しているのです。

 

 

<% @comment.each do |comment| %>
<%= render 'comment', comment: @comment %>
<% end %>
<!--これを省略すると-->
<%= render partia: 'comment', collection: @comments %>
<!--さらに省略すると-->
<%= render @comments %>

これは、renderでオブジェクトの集合(コレクション)を指定する記法の省略形です。

なるほど、each文が隠れていたからコメントが連続して表示されるのか。

ここまで調べるのにかなりの時間がかかりました笑

 

参考ページ

railsguides.jp

pikawaka.com

 

最後に

Railsの規約を前提とした実装は現場でもよく出てくるみたいなので、勉強する必要性を感じますね。

 

最後まで読んでいただき誠にありがとうございました。