tawara's blog

雑記。個人の見解です。

renderで繰り返し表示する【25/30 2nd】

こんにちは、たわらです。

本記事は、render メソッドの復習です。特に繰り返し表示の方法です。

掲示板を作れるアプリケーションを作成しています。で、掲示板一覧を取得して、そのうちの1つを選ぶと、詳細場面に移動します。そのページにはコメント作成フォームと、コメント一覧がある、という具合です。

render で繰り返し表示をする

で、コメント一覧を表示するのに、render を使います。

コントローラーはこんな感じ。

  def show
    @board = Board.find(params[:id])
    @comment = Comment.new
    @comments = @board.comments
  end

で、show.html.erb はこんな感じになります。

<!-- コメントフォーム -->
<%= render "comments/form", {comment: @comment, board: @board} %>

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

コメントエリアの方に着目です。

comments フォルダの_comments.html.erbをレンダーしています。で、@comments を comments というローカル変数で扱えるようにしています。

_comments.html.erbの中で、、、

<table id="js-table-comment" class="table">
  <%= render comments %>
</table>

としています。また render メソッドが登場してる!!!

で、_comment.html.erbを推測して、呼び出し、そのなかで、comment.idとかcomment.bodyのようにcomment変数を使っています。

@hoges でなくてもよいの?

こんな書き方できるんだ、というのが感想です。@hoges みたいなインスタンス変数じゃないとできないのでは?と思っていました。

Rails ガイドをよく読めば、次のようにあります。

パーシャルはデータの繰り返し (コレクション) を出力する場合にもきわめて便利です。:collection オプションを使用してパーシャルにコレクションを渡すと、コレクションのメンバごとにパーシャルがレンダリングされて挿入されます。

index.html.erb

html <h1>Products</h1> <%= render partial: "product", collection: @products %>

_product.html.erb

html <p>Product Name: <%= product.name %></p>

パーシャルを呼び出す時に指定するコレクションが複数形の場合、パーシャルの個別のインスタンスから、出力するコレクションの個別のメンバにアクセスが行われます。このとき、パーシャル名に基づいた名前を持つ変数が使用されます。上の場合、パーシャルの名前は_product であり、この_product パーシャル内で product という名前の変数を使用して、出力されるインスタンスを取得できます。

注目すべきは、

パーシャルを呼び出す時に指定するコレクションが複数形の場合、パーシャルの個別のインスタンスから、出力するコレクションの個別のメンバにアクセスが行われます

の部分です。

@ではじまる変数でないといけないとは書いてないですね、、、。

コレクションが複数形の場合ならこのように使えるということなのですね。

render hoges(コレクション)とすると、よしなに_hoge.html.erbを呼び出し、そのなかで、hoge.idとかhoge.nameとか使える、ということですね。

なので、パーシャルのファイル名を間違えないようにしないといけません。

最後に

額面どおりに学習していると、@がないといけない、のような謎のマイルールで脳みそを縛ってしまいます。

復習してスッキリしました。

読んでくださったかた、ありがとうございます。

参考文献

Rails ガイド