web-dev-qa-db-ja.com

Railsのlink_toメソッド:削除する必要があるときにGETする

私はマイケル・ハートルのRailsチュートリアル、そして何らかの理由で次のコードに従っています:

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

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

<%= javascript_include_tag :all %>

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

Rails 3.1。ヒントはありますか?

35
koggit

ほとんどのブラウザはDELETE動詞を実際にサポートしていないため、Railsは生成するHTMLを変更することで偽装します。Rails _data-method_に設定し、_"delete"_に設定します。したがって、ユーザーがリンクをクリックすると、実際にはGETリクエストとして発行されますが、_data-method_属性はRails magicは、ルーティングコードが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>
_
45
jergason

また、これがapplication.jsにあることを確認します。

//= require jquery
//= require jquery_ujs 

どうやらjquery_ujsのないjqueryがあり、それを追加するまで同じ問題がありました。

67
Jamel Toms

実際には、次のコードを使用する必要があります

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

問題を解決するか、この行を追加します// = application.jsにjquery_ujsを要求し、使用します:

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

マイケルのチュートリアルでも同じ問題に直面しました。 data-method="delete"は実際に期待どおりに動作します-コントローラーでdestroyアクションを呼び出します。 GET(最終的には失敗)を試みる理由は次のとおりです。

コントローラーのbefore_filterの1つがsigned_in_userに設定され、session_helper.rbsigned_in_userstore_locationを呼び出していることがわかります( session[:return_to]を現在のURLに更新します。

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

2
Brij

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

間違っている可能性のあることがいくつかあります。

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

これにより、jquery_ujsハンドラーの実行が妨げられ、リクエストは変更されず、標準のGETのままになります。

1
Itay Grudev

オンRails 5:

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

// = Rails-ujsが必要

0
DribeiroExp