12

コントローラーアクションの1つが終了したら、putリクエストのみを受け入れるページにリダイレクトする必要があります。私はredirect_toにputリクエストを使用させる方法を見つけようとしましたが、成功しませんでした。

これは可能ですか?または、これを達成する別の方法はありますか?

4

4 に答える 4

5

私はあなたがこれを行うことができるとは思わないし、制限は HTTP 自体の一部であると思う.

redirect_toを使用する場合 - パラメータで特に指定しない限り、リダイレクトは「302 Moved」ヘッダーとして発生します。

HTTP Spec 自体を見ても、ブラウザがリダイレクト経由で行うリクエストのタイプを変更する方法は明らかにされていません。

HTTP リダイレクト:

このクラスのステータス コードは、リクエストを満たすためにユーザー エージェントがさらにアクションを実行する必要があることを示します。必要なアクションは、2 番目の要求で使用されるメソッドが GET または HEAD である場合にのみ、ユーザーとの対話なしでユーザー エージェントによって実行される場合があります。

この機能を実現するには、JavaScript を使用するか、アプリケーションの制御の流れを再考する必要があると思います。

于 2009-03-22T01:05:38.913 に答える
3

アクションがリダイレクト元と同じコントローラーにある場合は、単純にアクションを呼び出してテンプレートを次のようにレンダリングします。

def show
  index
  render :action => "index"
end

そうでない場合、私はあなたがそれをどのように行うのかわかりません。

于 2009-03-22T06:01:50.497 に答える
2

わかりましたので、問題の解決策を見つけました。ここで状況に関する非常に良い記事を見つけました。私の実装は次のようになります。

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 要求を「偽造」することができました_methodput通常のリクエストを見ると、すべてパラメータpostを持つフォームからのものです。_methodそのため、少しハックですが、仕事は完了します。

redirect_postまた、ハッシュの値を呼び出すときに文字列であることを確認する必要があります。そうしないと、エラーがスローされます。

于 2009-03-22T18:57:38.777 に答える
1

Javascriptを使用して、クライアントからputリクエストを発行する別のページにリダイレクトできます。

于 2009-03-22T00:22:37.287 に答える