実践で学ぶRuby on rails 〜仮説千本ノック〜

プログラマーとして独立するため日々スキルアップに励んでいます。優れたプログラマは仮説を立てるのがうまい。そこを目指して仮説を立てては検証する日々です!!

一覧を作る方法

・部分テンプレート

グループチャットの一覧を表示させるページで、サッカーに関するチャットを全て一覧表示させる場合。

投稿者名、投稿内容のビューファイルに関する記述は一度で済ませたいので、1組分だけ書いて、部分テンプレート化する。

それをメインのページでrenderで読み込むのですが、renderにcollectionオプションをつけることで、複数あるサッカーグループ内のメッセージ、@messagesを繰り返し表示することが可能となります。

 

サッカー

 

直人

明日試合だね!

 

よしき

頑張ろう!!

 

ゆうた

応援行くよ!!

 

main_chat.html.haml

.messages
= render "message", @messages

 

※前提知識

基本的な記法では、

.messages

 - @messages.each do |message|

   = render partial: "message", local: { message: message }

                                                    local変数へ代入 ←eachのmessage

each文も、変数への代入もくどく書く古い書き方ですので、処理に時間がかかります。

 

これを1段階、簡略化したのが、

.messages

  = render partial: "message", collection: @messages

each文の使用を取りやめ、変数への代入を省略することでスッキリしました。

 

これをさらに、

「こんなにくどく書かなくても、最低限の情報だけでいいでしょ!」

という配慮で短くしたのが、上記のコードです。

ただし、省略しているだけで、collectionメソッドは使われていますし、変数への代入も行われています(each文は省略ではなく、使われていません。※似たような繰り返し機能が行われているだけ)

 

ただし、使える条件として、

@〇〇〇〇sの単数形=部分テンプレの名称

である必要があります。 

 

_message.html.haml

.message
.message__upper-info
.message__upper-info__talker
message.user.name
.message__upper-info__date
message.created_at.strftime("%Y年%m月%d日 %H時%M分")
.message__lower-info
- if message.content.present?
%p.message__lower-info__content
= message.content
= image_tag message.image.url, class: "message__lower-info__image" if message.image.present?
 

 

 

= render "部分テンプレート", collection: @〇〇〇〇s(インスタンス変数)とすることで、複数あるインスタンス変数を1ずつ繰り返して処理できるのです。