LoginSignup
5
4

More than 3 years have passed since last update.

【Rails】部分テンプレート(render)で別のコントローラーのビューを呼び出す方法

Posted at

はじめに

違うファイルのビューを他のファイルのビューに表示さる際、部分的にそのビューをrenderで呼びだすことができます。
そんな、部分テンプレートの方法について紹介します。

目次

  1. 部分テンプレートファイルの名前について
  2. renderで呼び出す
  3. コントローラーへの定義

開発環境

ruby 2.6.5
rails 6.0.0

実装

それでは実装していきます〜

1. 部分テンプレートファイルの名前について

まず、部分テンプレートとしてビューファイルを作成する時は_index.html.erbのようにファイル名の前に_(アンダースコア)をつけます。

スクリーンショット 2020-11-23 5.40.44.png

今回はproductsコントローラーのビューを部分テンプレートとして使いたいので、products/_indexとなるようにファイル名を編集すます。

2. renderで呼び出す

次にテンプレートする側にrenderメッソドを記述します。
今回は以下の記述をします。

app/views/tops/index.html.erb
#省略
<%= render partial: "products/index" %>

構文はこちらです。

render partial: コントローラー名/ファイル名

partialオプションは部分テンプレートを呼び出す時に使います。ただ、強調しているだけ、つけなくても呼び出せます。

スクリーンショット 2020-11-23 5.48.40.png

これで完成!!と思ったのですが、今回@productsを定義してProductモデルからデータを取得してビューに表示してる為、topsコントローラーでも定義が必要です。

3. コントローラーへの定義

保存したデータを呼び出す場合コントローラーでインスタンス変数にデータを代入してビューで使用します。

productコントローラーで動かすのであればそちらに@productsを定義しますが、今回はtopsコントローラのアクションが動くのでそちらで定義する必要があります。

app/views/products/_index.html.erb
<h1>Products#index</h1>
<p>Find me in app/views/products/index.html.erb</p>

<div class="#">
  <% @products.each do |product|  %> #ここで@productsを定義してるので、コントローラーでも定義が必要です。
    <%= product.name %>
    <%= product.text %>
  <% end %>
</div>

このproducts/_index.html.erbが部分テンプレートとして呼び出されるので、呼び出された側のtops_contller.rbでも@products定義が必要です。

app/contollers/tops_contller.rb
class TopsController < ApplicationController
  def index
    @tops = Top.all
    @products = Product.all #部分テンプレートで_index.htmlを表示させる為の定義

  end

これで完成です!!!

まとめ

以上部分テンプレートの手順でした。
用途に応じて他にもやり方がありますが、今回はこの方法で実装してます。

最後に

私はプログラミング初学者ですが、自分と同じ様にエンジニアを目指す方々の助けになればと思い、記事を投稿しております。
それではまた次回お会いしましょう〜

5
4
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
5
4