大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

【Rails】部分テンプレートとブロック構文

※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。

【目次】

 

メリット

部分テンプレートに変数を渡す時は「partial」と「locals」を一緒に使う、もしくはどちらも使わない

 

背景

部分テンプレート元に変数を渡そうとしたら、思ったように渡せなかった。

link_toメソッドで画像とテキストを作成しようとしたら、上手くいかなかった。

 

link_toメソッドの問題を解決するのは少し時間がかかりました。 

 

内容

◆ルーティングとコントローラーの記述内容

routes.rb

get 'users/:id/lists', to: 'users#lists'

users_controller.rb

def lists
 #ログインしているユーザーが持っている商品情報を変数に代入
@items = Item.where(user_id: current_user.id)
end

 

◆部分テンプレートに変数を渡す

lists.html.erb

 <div class="content">
<ul class="item-list">
<% if @items.present? %>
<% @items.each do |item| %>
<%= render partial: "mypages/item_box", locals: {item:item} %>
<% end %>
<% else %>
<div class="item-link">
<div class="item-body">
商品がありません
</div>
</div>
<% end %>
</ul>
</div>

 

部分テンプレートでは、下記の方法で変数を渡すことができます。

= render partial: 'shared/item_header', locals: { item: @item }

もしくは

= render 'shared/item_header', item: @item 

「partial:」を省略した場合は、「locals:」も省略しないといけない。

「locals」に渡す変数が1つだけの場合は、中括弧を省略する場合が多いです。

 

mypages/item_box.html.erb

【each構文で変数を作成しているのが条件(今回は上記の部分テンプレート先「lists.html.erb」に定義)】
<li>
<%= link_to check_item_path(item.id), class: "item-link" do %>
<figure>
<%= image_tag "item.images_id.image", alt: "" %>
</figure>
<div class="item-body">
<div class="item-name">
<%= item.name %>
</div>
</div>
<% end %>
</li>

link_toメソッドでブロック構文を使用することで、each構文で定義した変数をメソッド内でも使えるようになる。

また、link_toメソッド内でリンクが生成されます。

 

◆余談

パスを指定する際に、毎回「_pathペルバー」を調べているので、Railsガイドに記載されている内容を転載しておきます。

2.3 パスとURL用ヘルパー

リソースフルなルーティングを作成すると、アプリケーションのコントローラで多くのヘルパーが利用できるようになります。resources :photosというルーティングを例に取ってみましょう。

  • photos_path/photosを返します
  • new_photo_path/photos/newを返します
  • edit_photo_path(:id)/photos/:id/editを返します (edit_photo_path(10)であれば/photos/10/editが返されます)
  • photo_path(:id)/photos/:idを返します。 (photo_path(10)であれば/photos/10が返されます)

これらの_pathヘルパーには、それぞれに対応する_urlヘルパー (photos_urlなど) があります。_urlヘルパーは、_pathの前に現在のホスト名、ポート番号、パスのプレフィックスが追加されている点が異なります。 

引用元:Rails のルーティング - Rails ガイド

 

今後に向けて

3つのポートフォリオのデプロイが終わり、やっとコードの記述を始めることができました。ここまで長かった・・・

 

これからどんどんコードを書いていきますが、その中で忘れていることもたくさんあると思うので、今回のようにこまめに日記にしていこうと思います。

 

参考サイト

Rails4 で render partial 部分テンプレートに変数を渡す(locals option)を使う時の注意点 - Qiita

link_toでネストした画像や文字列を 表示する方法 - Qiita

Rails のルーティング - Rails ガイド