Ruby on Railsでのリダイレクトの方法【Ruby on Rails超入門】

2019年1月3日木曜日

Ruby on Rails

Ruby on Rails リダイレクト

こんにちは、財前航介です。

Webアプリケーションの開発をしていると、リダイレクトを行う場面はとても多いと思います。

リダイレクトとは、処理の途中で、別の画面に自動的に遷移するような仕組みですね。

Ruby on Railsには、リダイレクトを行うためのメソッド、redirect_toが用意されています。

このredirect_toというメソッドには、単に画面遷移を行うだけでなく、遷移前の値を遷移後の画面に引き継ぐなど、便利な機能が用意されています。

本日は、Ruby on Railsにおけるリダイレクトの方法について学んでいきましょう。


Ruby on Railsでのリダイレクトの方法【Ruby on Rails超入門】

Ruby on Rails リダイレクトの方法

Ruby on Railsでリダイレクトを行うには、コントローラーのアクションの中で、redirect_toというメソッドを使うのが一般的です。

コントローラーのアクションという言葉を聞いたことがない方は、一旦以下の記事に目を通しておくと、理解が深まるかもしれません。

アクションとは【Ruby on Rails超入門】>>


何はともあれ、具体例を元に使い方を見てみるのが一番早いでしょう。


具体例を元に、Ruby on Railsのリダイレクトを学んでみる


まずは、リダイレクトの遷移先として、以下のような画面を作ります。
(作り方は、後ほど順を追って見ていきます。)

Ruby on Rails リダイレクトの方法1

上記の画面にもありますが、act2というアクションがリダイレクト後に呼び出されるアクションになります。

念のため、アプリケーションの作成から順番に見ていきましょう。


1. 下記のコマンドでアプリケーションを作成:
rails new exampleAPP


2. 作成したアプリケーションのフォルダ内に入ってみましょう:
cd exampleAPP/


3. 下記のコマンドでコントローラーを作成します:
rails g controller con1


4. 下記のパスにある、routes.rbを編集しましょう:
exampleAPP/config/routes.rb

routes.rbに記載する内容は以下です:
Rails.application.routes.draw do
  get "con1/:action" => "con1"
end


5. 下記のパスにある、コントローラーを編集します:
exampleAPP/app/controllers/con1_controller.rb

con1_controller.rbに記載する内容は以下です:
class Con1Controller < ApplicationController

  def act2
    render plain: "act2アクション内で描画しています。\r\n" + \
                  "リダイレクト前のアクションから引き継いだ値:" + \
                  "[" + flash[:notice].to_s + "]"
  end

end
※ 上記はRails 5以降での記述です。Railsのバージョンが4以前の方は、「plain」という記述の代わりに、「text」と記載して下さい。

flash[:notice].to_sという記載がありますが、これは、後ほどの説明で用いる部分ですので、今は気にしないでください。現時点では、空文字列が返されます。



6. 上記の手順を行ったうえで、ブラウザから「con1/act2」というリクエストをしてみましょう。
Ruby on Rails リダイレクトの方法2

これで、リダイレクト先の画面が完成しました。
次に、リダイレクト元のアクションを作成してみましょう。



7. 以下のパスにあるコントローラーをもう一度編集します:
exampleAPP/app/controllers/con1_controller.rb

con1_controller.rbに記載する内容は以下です:
class Con1Controller < ApplicationController

  def act1
    redirect_to action: "act2"
  end

  def act2
    render plain: "act2アクション内で描画しています。\r\n" + \
                  "リダイレクト前のアクションから引き継いだ値:" + \
                  "[" + flash[:notice].to_s + "]"
  end

end

上記の赤字部分を追加しています。
ここで、やっとリダイレクトが出てきましたね。

redirect_toというメソッドが記載されていますが、これこそが、リダイレクトを行うためのメソッドです。

act1というアクションが呼び出された際、act2というアクションにリダイレクトを行っているのです。

今回は
redirect_to action: "act2"
という風に、アクション名を指定していますが、

redirect_to "/con1/act2"
のように、パスやURLを指定することもできます。



8. 試しにWebブラウザーから、act1アクションをリクエストしてみましょう。
Ruby on Rails リダイレクトの方法3



9. act2アクションへ、リダイレクトされていることが分かります。
Ruby on Rails リダイレクトの方法4

以上で、act1からact2への、リダイレクトは成功しました。

次は、リダイレクト前の処理で用いた値を、リダイレクト後にも使う方法を見てみましょう。



10. 下記のパスにあるコントローラーを、もう一度編集します:
exampleAPP/app/controllers/con1_controller.rb

con1_controller.rbに記載する内容は以下です:
class Con1Controller < ApplicationController

  def act1
    flash[:notice] = "act1の中で代入しました。"
    redirect_to action: "act2"
  end

  def act2
    render plain: "act2アクション内で描画しています。\r\n" + \
                  "リダイレクト前のアクションから引き継いだ値:" + \
                  "[" + flash[:notice].to_s + "]"
  end

end

上記の赤字の部分が追加された箇所です。

ここでは、flash[:notice]に対して「act1の中で代入しました。」という文字列が代入されています。

このflashというオブジェクトに値を格納しておくと、リダイレクト後に値を取り出すことができるのです。

「notice」というのは、値を取り出すためのキーとなる部分ですので、好きな文字列に変更して頂いても構いません。



11. もう一度Webブラウザーから、act1アクションをリクエストしてみましょう。
Ruby on Rails リダイレクトの方法5



12. リダイレクトが行われ、flashに代入された値が展開されていることが分かります:
Ruby on Rails リダイレクトの方法6

このflashに代入された値は、「アクション ⇒ リダイレクト ⇒ アクション」という一連の流れの間しか、値が保持されません。

そのため、ブラウザで再読み込みなどを行うと、値が消えてしまいます。



13. ブラウザの再読み込みを行う。
Ruby on Rails リダイレクトの方法7

リロード後の画面では、flash内の値が消えていることが分かります。


まとめ:
Ruby on Railsのリダイレクトを用いて、高機能なWebアプリを作ろう!

Ruby on Railsのリダイレクトを用いて、高機能なWebアプリを作ろう!

如何でしたでしょうか?

Ruby on Railsでのリダイレクトの方法を、理解して頂けたでしょうか。

こちらの記事でご説明した内容は、以下のようなものでした。

  • Ruby on Railsにおけるリダイレクトにはredirect_toメソッドを用いる

  • flashオブジェクトを使って、リダイレクト前後で値を受け渡せる

Ruby on Railsで用意されている機能を効果的に使うと、Webアプリケーションの開発効率が格段に上がります。

Ruby on Railsを用いるメリットなどについて、より詳しく知りたい方は、以下の過去記事をご参照ください。
Ruby on Railsのメリット・デメリット【初心者にもわかりやすく解説】>>