【Rails】部分テンプレートとブロック構文
※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。
【目次】
メリット
部分テンプレートに変数を渡す時は「partial」と「locals」を一緒に使う、もしくはどちらも使わない
link_toメソッドで画像とテキストを作成したい場合はブロック構文を利用する
背景
部分テンプレート元に変数を渡そうとしたら、思ったように渡せなかった。
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つだけの場合は、中括弧を省略する場合が多いです。
◆link_toメソッドで画像とテキストを作成する
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ガイドに記載されている内容を転載しておきます。
リソースフルなルーティングを作成すると、アプリケーションのコントローラで多くのヘルパーが利用できるようになります。
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の前に現在のホスト名、ポート番号、パスのプレフィックスが追加されている点が異なります。
今後に向けて
3つのポートフォリオのデプロイが終わり、やっとコードの記述を始めることができました。ここまで長かった・・・
これからどんどんコードを書いていきますが、その中で忘れていることもたくさんあると思うので、今回のようにこまめに日記にしていこうと思います。
参考サイト
Rails4 で render partial 部分テンプレートに変数を渡す(locals option)を使う時の注意点 - Qiita