51

私はMichaelHartlのRailsチュートリアルに従っており、何らかの理由で次のコードを使用しています。

<%= link_to 'delete', user, :method => :delete, :confirm => "You sure?",
                                :title => "Delete #{user.name}" %>

GETリクエストを発行します(railsサーバーログを確認して確認しました)。また、アプリケーションビューに次の行があることを確認しました。

<%= javascript_include_tag :all %>

私が完全に理解していなかったことの1つであり、それがおそらく私の問題の原因です。「削除」メソッドはどこで定義されているのでしょうか。Hartlのソースコードで、彼がコントローラーで「削除」ではなく「破棄」メソッドを定義していることを確認しました。ただし、link_toを:method =>:destroyに変更しても、GETが発行されるだけです。

Rails3.1を使用しています。任意のヒント?

4

7 に答える 7

78

また、これがapplication.jsにあることを確認してください。

//= require jquery
//= require jquery_ujs 

どうやら私はjquery_ujsなしでjqueryを持っていました、そして私がそれを追加するまで私は同じ問題を抱えていました。

于 2013-12-27T05:27:51.570 に答える
52

ほとんどのブラウザは実際にはDELETE動詞をサポートしていないため、Railsは生成するHTMLを変更することでそれを偽造します。Railsはと呼ばれるHTML5属性をタックし、data-methodそれをに設定し"delete"ます。したがって、ユーザーがリンクをクリックすると、実際にはGETリクエストとして発行されますが、このdata-method属性はRailsの魔法を可能にし、ルーティングコードがそれをDELETEリクエストとして認識する必要があることを意味します。

編集:

コンソールで自分でテストできます。実行bundle exec rails cしてコンソールに入り、これが生成するHTMLを確認します。

helper.link_to "delete", "foobar/delete", :method => 'delete'

HTMLは次のようになります。

<a href="foobar/delete" data-method="delete" rel="nofollow">delete</a>
于 2011-09-19T02:36:14.417 に答える
15

次のコードを使用する必要があります

<%= button_to "delete", @user_current, :method => "delete" %>

問題を解決するか、次の行を追加します// = request jquery_ujs to application.js and use:

 <%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } ,
                            :title => "Delete #{user.name}" %>
于 2015-02-13T00:08:23.027 に答える
4

ブラウザは動詞をサポートしていないため、Railsは、標準またはを介してリクエストをDELETEシミュレートすることにより、この問題の回避策を作成します。動作する方法は、RailsがリクエストをDELETEとして処理するようにリクエストを変更するすべてのリンクのJavaScriptハンドラーを使用することです。このJavaScriptハンドラーは、ライブラリーによって提供されます。DELETEGETPOSTmethod: :deletedata-method="delete"jquery_ujs

うまくいかなかった可能性のあることがいくつかあります。

  1. 両方がjqueryあり、にjquery_ujs含まれていることを確認してくださいapplication.js。両方がないと、データ属性は何も処理されません。
  2. 問題のリンクに実際にmethod: :deleteオプションが指定されていることを確認してください。
  3. たとえば、次のように、何らかの理由で問題のリンクのイベント伝播を停止していないことを確認してください。
$( 'a' ).click( function( event ) {
    event.stopPropagation()
})

これにより、jquery_ujsハンドラーが実行されなくなり、要求が変更されることはなく、標準のGETのままになります。

于 2017-09-20T11:34:49.557 に答える
2

Michaelのチュートリアルでも同じ問題に直面しました。data-method="delete"実際には期待どおりに機能します。コントローラーで破棄アクションを呼び出します。それが試みたGET(そして最終的に失敗した)理由は次のとおりです。

before_filterコントローラのの1つがに設定されていることに気付くでしょう。signed_in_userそして、では、現在のURLに更新される呼び出し(プライベートメソッド)に気付くでしょう。session_helper.rbsigned_in_userstore_locationsession[:return_to]

したがって、コントローラーの破棄アクションに戻ると、redirect_back_or結果はになりGET current_urlます。ユーザーがまだサインインしていない場合signed_in_userにのみ呼び出すようにヘルパーを変更しました。store_location

于 2012-04-06T03:26:33.313 に答える
1

Rails 5:

同じ問題があります。すべての「DELETE」投稿が危険にさらされ、私のクラッドページに影響を与え、サインアウトを考案しました...問題を解決するために私がしなければならなかったのは:

//=rails-ujsが必要

于 2018-07-19T14:23:09.207 に答える
0

必要なのは、以下のコード行を追加することだけです

//= require jquery_ujs 

バグのようです:))

于 2019-10-18T12:13:56.163 に答える