24

私はという名前のコントローラーで次のメソッドを持っていますtareas_controller

def destroy
  @tarea = Tarea.find(params[:id])
  @tarea.destroy

  respond_to do |format|
    format.html { redirect_to tareas_url }
    format.json { head :ok }
    format.js { redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, :method=>:get}
  end

end

レコードは正常に削除されます。その後、サーバーに次のコードが表示されます。

http://127.0.0.1:3000/clientes/12.js?method=get Completed 302にリダイレクトさ れ、174ミリ秒で見つかりました

2012-05-06 19:20:07+0200で127.0.0.1のDELETE"/clientes/12.js?method=get"を開始しました。JSパラメーターとしてClientesController#destroyによる処理:{"method" => "get"、 "id" => "12"} Cliente Load(0.0ms)SELECT"clientes"。*FROM "clientes"WHERE"clientes"。"id"=?LIMIT 1 [["id"、 "12"]] SQL(2.0ms)DELETE FROM "clientes"WHERE"clientes"。"id"=?[["id"、12]]完了406完了131msで受け入れられない

DELETE動詞を含むリクエストを新しいコントローラーに送信しているようですが、それを新しいコントローラーへのGETリクエストに変更する方法が見つかりません。

この問題を解決する方法について誰かにアドバイスしてもらえますか?

4

3 に答える 3

42

ステータス303でリダイレクトする必要があります。

GETまたはPOST以外のXHRリクエストを使用していて、リクエスト後にリダイレクトする場合、一部のブラウザは元のリクエスト方法を使用してリダイレクトに従います。これにより、二重DELETEなどの望ましくない動作が発生する可能性があります。これを回避するために303 See Other、GETリクエストを使用して追跡されるステータスコードを返すことができます。

  redirect_to posts_url, status: :see_other
  redirect_to action: 'index', status: 303

ソース:http ://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to

于 2014-01-07T18:19:21.793 に答える
1

良い方法ではありませんが解決しました。

次のルートを作成しました。

match 'mostrar_cliente/:id' => 'clientes#show', :via => :delete 

次に、リダイレクトを次のように書き直しました。

redirect_to "/mostrar_cliente/#{@tarea.cliente}", :format => :js

あまりクリーンなソリューションではありませんが、意図したとおりに機能しています:)

于 2012-05-08T11:47:08.057 に答える
0

ログを見ると、クエリ文字列で渡されているパラメータが「メソッド」であることがわかります。

Parameters: {"method"=>"get", "id"=>"12"}

Railsは、動詞を決定するために「_method」と呼ばれるパラメーターを期待しているため、リダイレクトを実行するときは、それが明示的に行われていることを確認する必要があります。

redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, '_method' =>:get
于 2012-05-06T17:25:53.050 に答える