コントローラーアクションの1つが終了したら、putリクエストのみを受け入れるページにリダイレクトする必要があります。私はredirect_toにputリクエストを使用させる方法を見つけようとしましたが、成功しませんでした。
これは可能ですか?または、これを達成する別の方法はありますか?
コントローラーアクションの1つが終了したら、putリクエストのみを受け入れるページにリダイレクトする必要があります。私はredirect_toにputリクエストを使用させる方法を見つけようとしましたが、成功しませんでした。
これは可能ですか?または、これを達成する別の方法はありますか?
私はあなたがこれを行うことができるとは思わないし、制限は HTTP 自体の一部であると思う.
redirect_toを使用する場合 - パラメータで特に指定しない限り、リダイレクトは「302 Moved」ヘッダーとして発生します。
HTTP Spec 自体を見ても、ブラウザがリダイレクト経由で行うリクエストのタイプを変更する方法は明らかにされていません。
このクラスのステータス コードは、リクエストを満たすためにユーザー エージェントがさらにアクションを実行する必要があることを示します。必要なアクションは、2 番目の要求で使用されるメソッドが GET または HEAD である場合にのみ、ユーザーとの対話なしでユーザー エージェントによって実行される場合があります。
この機能を実現するには、JavaScript を使用するか、アプリケーションの制御の流れを再考する必要があると思います。
アクションがリダイレクト元と同じコントローラーにある場合は、単純にアクションを呼び出してテンプレートを次のようにレンダリングします。
def show
index
render :action => "index"
end
そうでない場合、私はあなたがそれをどのように行うのかわかりません。
わかりましたので、問題の解決策を見つけました。ここで状況に関する非常に良い記事を見つけました。私の実装は次のようになります。
private
def redirect_post(redirect_post_params)
controller_name = redirect_post_params[:controller]
controller = "#{controller_name.camelize}Controller".constantize
# Throw out existing params and merge the stored ones
request.parameters.reject! { true }
request.parameters.merge!(redirect_post_params)
controller.process(request, response)
if response.redirected_to
@performed_redirect = true
else
@performed_render = true
end
end
次に、このメソッドを次のように呼び出しました。
redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token]
そのため、(を使用して) 投稿要求を作成し、redirect_post
「put」をパラメーターに割り当てることで、put 要求を「偽造」することができました_method
。put
通常のリクエストを見ると、すべてパラメータpost
を持つフォームからのものです。_method
そのため、少しハックですが、仕事は完了します。
redirect_post
また、ハッシュの値を呼び出すときに文字列であることを確認する必要があります。そうしないと、エラーがスローされます。
Javascriptを使用して、クライアントからputリクエストを発行する別のページにリダイレクトできます。