RailsでPOSTリクエストではリダイレクトできないことへの対応

Rails では POST リクエストによるリダイレクトができないようです。というか、HTTP protocol の RFC で定められていて、POSTリクエストではリダイレクトできないらしい。GETのみ。Stack Overflow に書いてありました。

ruby – redirect_to using POST in rails – Stack Overflow

スポンサーリンク

— 環境 —
rails-4.0.1
devise-3.2.2

HTTP の POST メソッドによるリダイレクトはできなかった

想定したケースは、ログインしていないユーザーが、フォームのサブミットによる POST リクエストで複数ページを遷移している途中で、ログイン用ページに移動してログインした場合。この POST リクエストのページ遷移では DB に対する処理はなし。ショッピングカートのようにセッションに情報を保存させるだけです。

実現したかったことは、ユーザーがログイン後に、ログイン直前にいた POST リクエスト遷移の途中のページにリダイレクトさせたいと考えました。そこからユーザーが操作を再開できるようにしたいと。しかし…うーん、色々考えましたけど結局できませんでした。ログイン後のリダイレクトは GET リクエストになりルーティングエラーとなる。

セッションに POST リクエストのパラメータを保存

そこで、ログイン後に自動でリダイレクトさせる方法は諦めて、ログイン直前にユーザーがいたページの POST リクエストによるパラメータとアクションなどの情報を、セッションに保存して記憶することにしました。POST リクエストでページ遷移させるアクションに、以下を追加する。

some_controller/post_paging_action.rb

遷移中ページのページ番号の情報 params[:page].to_i と、コントローラー名、アクション名を保存させました。

ログイン後にセッション情報からログイン直前のページ情報を復元

ログインした後に任意のページにリダイレクトさせます。ここでは、after_login_page_action にリダイレクトさせると仮定。このページで、ユーザーがログイン直前にいたページの情報をセッションから復元します。

some_controller/after_login_page_action.rb

続いてビューにフォームを作成して、ユーザーがログイン直前にいたページに移動できるようにしました。hidden filed に、ログイン直前にいた戻るべきページのページ番号を含ませて POST リクエスト送信します。

after_login_page_action.html.erb

link_to に method: :post 指定では、なぜかURLにパラメータが付いてしまうので、フォームでページ移動させることにしました。ユーザーには、ログイン後に1クリックの負担をかけてしまいますが、一応これで妥協です。

戻ったページのビューでは、表示する情報はインスタンス変数、別途保存してあるセッション等から出力する必要があります。あと、必要に応じて、session[:back_controller] などのセッションは削除する。session[:back_controller] = nil などを必要なタイミングで。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!