rails renderの基礎から使い方まで(partial, 引数)

Railsでサンプルコードを探していると、renderというメソッドをよく見かけます。

しかし、

・よく見るけど、renderってなに?
・ControllerとViewのどちらでも使えるけど、同じもの?
・オプションを指定するとJSONとかXMLを出力できるってホント?

など、様々な疑問が浮かんでくると思います。

そこで今回は、

・renderとは
・Controllerでrenderを使う方法
・Viewでrenderを使う方法
・renderの発展的な使い方として、JSONやXMLで出力する方法

について説明します。

それでは行ってみましょう!

renderとは

renderは、レンダリング(rendering)という単語から名付けられたメソッドです。

renderの主な役割は、テンプレートを表示すること(=レンダリングすること)です。

MVCのControllerViewのどちらでも使用できますが、使い方には微妙な違いがあります。

また、renderには様々なオプションが用意されており、登録されたデータをJSONXMLで出力することもできます。

Ruby on Railsガイドの以下のページでもrenderについて触れていますので、もっと詳しく知りたい方はこちらも参考にしてください。

参考:https://railsguides.jp/action_view_overview.html

準備

renderの動作を確認するために、Ruby on Railsをインストールして、Railsサーバーを起動しておきましょう。

詳しくは、以下の記事で紹介していますので、ぜひご覧ください。

なお、今回の記事では、app/samurai/render-demoディレクトリにRailsをインストールしました。

初心者でもかんたん!Ruby on Rails の開発環境の構築手順(Mac/Windows 両対応)
更新日 : 2019年8月9日

Railsサーバーが起動できたら、いったんRailsサーバーを終了してから、次の手順を行います。

(1)以下のコマンドを1行ずつ順番に入力します。

Controller(Pages Controller)とView(index View、help View)、Model(Posts Model)が作成され、Railsコンソールが起動します。

(2)以下のコードを1行ずつ順番に入力します。

Postテーブルに必要なデータが入力されました。

「http://localhost:3000/」にアクセスしたときに、app/views/pages/index.html.erbテンプレート(indexビュー)がレンダリング(表示)されるようにします。

(3)config/routes.rbを編集します。

変更前:

変更後:

(4)以下のコマンドを入力します。

bin/rails server

Railsサーバーが起動します。

これで準備完了です。

(5)ブラウザで「http://localhost:3000/」にアクセスしてみましょう。

以下のように、app/views/pages/index.html.erbテンプレートがレンダリング(表示)されていれば、次に進みましょう。

rails-render01

Controllerでテンプレートを使う

Controllerでは、他のアクションのテンプレートをそのまま利用する場合に、renderを使います。

「準備」でconfig/routes.rb(ルーター)を編集して、「http://localhost:3000/」にアクセスしたときに、Pages Controllerのindexアクションによって、app/views/pages/index.html.erbテンプレート(indexビュー)がレンダリング(表示)されるように変更しました。

rails-render01

今度は、app/controllers/pages_controller.rb(Pages Controller)のindexアクションでrenderを使い、indexビューの代わりに、app/views/pages/help.html.erbテンプレート(helpビュー)がレンダリング(表示)されるように変更します。

(1)app/controllers/pages_controller.rbを編集します。

変更前:

変更後:

(2)ブラウザで「http://localhost:3000/」にアクセスします。

URLは変わりませんが、以下のように、app/views/pages/help.html.erbテンプレート(help)がレンダリング(表示)されていますね。

rails-render02

(3)app/controllers/pages_controller.rbを元に戻します。

変更前:

変更後:

これで、再びapp/views/pages/index.html.erbテンプレート(index)が呼び出されるようになりました。

以上が、Controllerでのrenderの基本的な使い方です。

Controllerで部分テンプレートを使う

次に、Controllerで部分テンプレートと呼ばれるモノを使ってみましょう。

複数の投稿を1ページで表示する場合は、以下のように同じフォーマットを繰り返し適用しますね。

このような場合に、部分テンプレートを使います。

rails-render03

ただ、今回の例は、Controllerから部分テンプレートを無理矢理使っている感じになりました。

部分テンプレートを使うのはViewのほうが良さそうです。

(1)app/views/pages/_post.html.erbを以下の内容で作成します。

このファイルが部分テンプレートです。

部分テンプレートのファイル名は、必ず_(アンダーバー)で始めます。

(2)app/controllers/pages_controller.rbを編集します。

変更前:

変更後:

(3)ブラウザで「http://localhost:3000/」にアクセスします。

手順の前に紹介したように、app/views/pages/_post.html.erbテンプレートがPostの数だけレンダリング(表示)されていることを確認してください。

変数を渡す

Controllerで部分テンプレートをレンダリングするときは、「:collection => Post.all」という書きかたでPostテーブルのデータを渡しています。

ここではさらに、モデルとは無関係のローカル変数を渡す方法を紹介します。

(1)app/views/pages/_post.html.erbを以下の内容に変更します。

変更前:

変更後:

「#90ee90」を「<%= bgcolor %>」に変更しました。

ここに変数bgcolorの値が入ることになります。

(2)app/controllers/pages_controller.rbを編集します。

変更前:

変更後:

「:locals => { :bgcolor => “#ffe6e6” }」で、変数bgcolor(値は”#ffe6e6”)を渡しています。

(3)ブラウザで「http://localhost:3000/」にアクセスします。

以下のように、色が変わりますね。

rails-render04

「#ffe6e6」を「lightsteelblue」に変更しても色を変えられます。

この後、Viewで部分テンプレートを使う方法を説明するために、app/controllers/pages_controller.rbを次のように戻しておきましょう。

(4)app/controllers/pages_controller.rbを編集します。

変更前:

変更後:

これで、「http://localhost:3000/」にアクセスしたときの表示が元に戻りました。

Viewで部分テンプレートを使う

ヘッダーやフッター、メニューなど、複数のページで共通の内容を表示するためには、Viewでrenderを使って部分テンプレートを呼び出します。

今回は、app/views/pages/index.html.erbテンプレート(indexビュー)にヘッダーとフッターを追加してみましょう。

各ファイル名は、以下のようにします。

項目ファイル名
ヘッダーapp/views/pages/_header.html.erb
フッターapp/views/pages/_footer.html.erb

(1)app/views/pages/_header.html.erbを以下の内容で作成します。

(2)app/views/pages/_footer.html.erbを以下の内容で作成します。

(3)app/views/pages/index.html.erbを編集します。

変更前:

変更後:

(4)ブラウザで「http://localhost:3000/」にアクセスします。

以下のように、「☆ヘッダー☆」や「★フッター★」が表示されていますね。

rails-render05

Viewでもrenderを使って、部分テンプレートを呼び出せましたね。

変数を渡す

Viewで部分テンプレートを使う場合も、Controllerで部分テンプレートを使う場合と同じように変数を渡せます。

先ほど作成した_post.html.erbをそのまま利用して、ViewでもPostテーブルのデータと、モデルと無関係のローカル変数を渡せることを確認しましょう。

(1)app/views/pages/index.html.erbを編集します。

変更前:

変更後:

(2)app/controllers/pages_controller.rbを編集します。

変更前:

変更後:

このように書くと、app/views/pages/index.html.erb(indexビュー)で必要な「@posts」をControllerから渡せます。

(3)ブラウザで「http://localhost:3000/」にアクセスします。

rails-render06

先ほどの例から色が変わっただけでなく、ヘッダーやフッターも付いたままですね!

JSONやXMLを返す

renderは、さまざまな方式でデータを出力できますので、その一例としてJSONやXMLを出力する方法も紹介しましょう。

今度はPosts Controllerを編集していますので、注意してくださいね!

(1)app/controllers/posts_controller.rbを以下のように編集します。

変更前:

変更後:

(2)ブラウザで「http://localhost:3000/posts.json」にアクセスします。

以下のように表示されます。

rails-render07

これは読みにくいので、整形すると以下のようになります。

(3)続けてブラウザで「http://localhost:3000/posts.xml」にアクセスします。

以下のように表示されます。

rails-render08

確かにXMLではありますので文句は言えませんが、コレジャナイ感が半端ないです。

JSONと同じようなXMLを出力するには、activemodel-serializers-xmlが必要でした。

(4)Gemfileの最終行に以下の内容を追加します。

(5)Railsサーバーを起動した端末でCtrlキーを押しながらCキーを押し、以下のコマンドを入力します。

(6)gemをインストールしたら、以下のコマンドを入力します。

Railsサーバーが起動します。

(7)もう一度ブラウザで「http://localhost:3000/posts.xml」にアクセスします。

rails-render09

これだ!

実は、app/controllers/posts_controller.rbを変更しなくても、JSONだけなら表示できます。

ただ、JSONだけでなくXMLも出力するなら、この手順で説明したようにposts_controller.rbを編集します。

まとめ

今回はRailsのrenderについて解説していきました。

ControllerでもViewでも、renderを使って部分テンプレートを使ったり、変数を使って値を渡したりできました。

renderは、さまざまな方式でデータを出力できますので、その一例としてJSONXMLを出力する方法も確認しました。

Viewに同じようなHTMLを書くことになったら、renderで(主観的ですが)キレイにまとめることを検討します。

しかし、複雑なコードを書いてようやくまとめられる!というレベルのときは、Viewのコードをキレイにすることを目指して、Controllerでrenderを使うことも検討しましょう。

ControllerでもViewでも書けるのは便利な反面、役割分担がないがしろにされる一因にもなってしまいますので、十分に検討して、動作を追いかけやすいコードを書くように注意してください。

それでは!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

侍テック編集部

侍テック編集部

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説