- 締切済み
リダイレクトでPOSTリクエストを復元する方法
【行いたいこと】 RailsでRESTフルなリソースを扱うアプリを開発しています。 アプリはユーザ認証機能を備えており、 RESTフルなリソースの操作(作成や削除など)はログインしたユーザだけが行えます。 ログインしていないユーザがこれらの操作をおこなうリクエストを送ってきた場合には、 認証ページに遷移させ、ユーザがログインした直後に、 ユーザ操作なしで当初のアクセスに対する操作処理を行いたいです。 【もくろみ】 ログインしたユーザだけが行える操作へのアクセスは、 フィルタ(before_filter)を使いインターセプトし、 ログインしていないユーザの場合には認証ページにリダイレクトします。 インターセプタ時点でリクエスト情報をセッションに格納しておき、 ログイン後にセッションからリクエスト情報を取り出し、 その情報を使ってリダイレクトすれば良いと考えました。 【問題点】 GETリクエスト(GETメソッドでのHttpリクエスト)をインターセプタした場合は上手くいきましたが、 POSTリクエストではリクエストを復元できません。 GETメソッドのリクエストになってしまいます。 リダイレクト(redirect_to)はブラウザにGETリクエストしか要求できないためです。 何か解決策はありますでしょうか。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ggaogg
- ベストアンサー率43% (38/88)
こちらも同じような機能を実装したのですが、リダイレクトを使用せず、認証後にリンクをクリックしてもらうという妥協を行いました。 ・認証ページへのリダイレクト前にリクエストメソッドをセッションに登録 session[:return_to] = request.request_uri session[:return_to_method] = request.method ・認証後に「処理を続ける」リンクを表示する(そのメソッドがセッションに登録してあったもの) link_to '処理を続ける', session[:return_to], :method => session[return_to_method] ・リンクを経由すると正しいアクションへ まだパラメータを渡していないのですが、同じようにできると思います。パラメータ渡すのって:params?:url?:option? まだ調べてませんが・・ Restfulな設計と散りばめた認証は、なんだか相性が悪いですね・・。 あと、Ajaxを使用して、認証画面を別ウィンドウで開くというのも考えましたが、RJSまだ知らないので、試してません。。
- ggaogg
- ベストアンサー率43% (38/88)
えーっと、試してみました。できませんでした。 newやeditのアクションへ行く時に認証を行っていたので気づきませんでした。。 で、質問からもうかなり時間が経っているので、なんとなく投稿します。 で、ログイン機能もどきとか実装して確認するのが面倒くさいのでほんとうまくいくか分かりませんが、 before_filterで実行される処理の始めでPOSTデータをセッションに格納して、ログイン後に復元すればいいのではと思ったのですが、これでは無理なんですっけ? paramsからではなくsessionからの復元になりますけど・・。