1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

もそ、プログラミングを学ぶ【Ruby & Rails復習編】〜部分テンプレート〜

Last updated at Posted at 2019-04-17

エラー問題のロープレを始めたものの、何ひとつわからず途方にくれる もそ。
コードの復習をしていると、ノリと勢いでわかったことにしていた箇所がどんどん出てきます...。

今日はそんなノリと勢いでなあなあにしていた部分テンプレートについて書いていきます。

部分テンプレートとは?

ビューファイルを記述していくと、同じようなレイアウトの構造がいくつか出てくることがあります。
同じレイアウト、同じ内容のコードを何回も繰り返し記述するのはイヤですよね。
そこで、共通のHTML構造をテンプレートにしてしまおう!というのが部分テンプレートです。

無題1160 2.jpeg

どうやって記述するの?

部分テンプレートを記述するには、renderメソッドを使います。
基本的な使い方はこんな感じです。

<%= render partial: "部分テンプレート名" %>

これで部分テンプレートの呼び出しができました!
このままだとindex.html.erbファイル内で部分テンプレートを呼び出しただけで、肝心の部分テンプレートがありません。
そこで、部分テンプレートにしたいHTMLの記述を別のファイルに保存する必要があります。

ファイル名には規則があり、_(アンダーバー)部分テンプレート名とします。
なので部分テンプレートの名前を"sample"としたい場合は、ファイル名は**_sample.html.erb**になります。

では先ほど例に出したツイッターのように、同じ部分テンプレートを繰り返し配置するような場合にはどのように記述すればよいでしょうか?


   <% @tweets.each do |tweet| %>  
②    <%= render partial: "sample", locals:{moso: tweet} %> 
   <% end %> 

まず、①のコードから解説していきます。
①の@ tweetsはコントローラで定義したインスタンス変数で、|tweet|は配列で格納された一つ一つのレコードを表しています。
つまりtweetsの中から**「tweet」という名前の情報を1つずつ変数を取り出しています**。
each do~endの記述があるので、配列の要素の数だけ情報を取り出す作業を繰り返しているということになります。

②は部分テンプレートの記述です。
render partial: "sample"で、まず"sample"という名前の部分テンプレートファイルを作りますよ、と宣言します。
次にlocals:ですが、これは部分テンプレートに渡したい値を指定します
{moso:tweet}では、さきほど①で記述した|tweet|の情報を「moso」という名前で部分テンプレート内に表示していきます、と宣言しています。

文章だけではわかりづらいので、部分テンプレートのファイルを見ていきましょう。


<div class="content_post" style="background-image: url(<%= moso.image %>);">
  <div class="more">
    <span><%= image_tag 'arrow_top.png' %></span>
    <ul class="more_list">
      <li>
        <%= link_to "詳細", tweet_path(moso.id), method: :get %>
      </li>
      <% if user_signed_in? && current_user.id == moso.user_id %>
        <li>
          <%= link_to '編集', "/tweets/#{moso.id}/edit", method: :get %>
        </li>
        <li>
          <%= link_to '削除', "/tweets/#{moso.id}", method: :delete %>
        </li>
      <% end %>
    </ul>
  </div>
  <%= simple_format(moso.text) %>
  <span class="name">
    <a href="/users/<%= moso.user_id %>">
      <span>投稿者</span><%= moso.user.nickname %>
    </a>
  </span>
</div>

こちらのコードの中で「moso」と書かれた部分は、index.html.erbファイル内で定義した、tweetカラムから取り出された情報を表しています。

--
いかがだったでしょうか。
こうやってアウトプットしてみると、いかに自分がフワッフワの理解度で勉強していたかが分かります...
そして絵だけがどんどん上手くなっていってしまっている...もその学習はまだまだ続く。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?