Метод link_to в Rails: ПОЛУЧЕНИЕ, когда следует УДАЛИТЬ - PullRequest
33 голосов
/ 19 сентября 2011

Я следую учебному пособию Майкла Хартла по Rails и по какой-то причине следующий код:

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

Выдает запрос GET (как я проверил, проверив журнал сервера rails).Я также проверил, что в моем приложении отображается следующая строка:

<%= javascript_include_tag :all %>

Одна вещь, которую я не совсем понял, и это, вероятно, источник моей проблемы: где определен метод "delete"?В исходном коде Хартла я подтвердил, что он определяет метод «уничтожить» в контроллере, а не «удалять».Но даже если я изменю link_to на: method =>: destroy, он просто выдает GET.

Я использую Rails 3.1.Любые советы?

Ответы [ 6 ]

66 голосов
/ 27 декабря 2013

Также проверьте, что это в вашем application.js:

//= require jquery
//= require jquery_ujs 

Очевидно, у меня был jquery без jquery_ujs, и у меня была такая же проблема, пока я не добавил это.

43 голосов
/ 19 сентября 2011

Большинство браузеров на самом деле не поддерживают глагол 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>
9 голосов
/ 13 февраля 2015

На самом деле, вы должны использовать следующий код

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

Это решит проблему или добавит эту строку // = require jquery_ujs в application.js и использует:

 <%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } ,
                            :title => "Delete #{user.name}" %>
2 голосов
/ 06 апреля 2012

Я столкнулся с той же проблемой в обучении Майкла. data-method="delete" на самом деле работает как ожидалось - он вызывает действие уничтожения в контроллере. Причина, по которой он пытается GET (и в конечном итоге потерпит неудачу), заключается в следующем:

Вы заметите, что один из before_filter в контроллере установлен на signed_in_user, а в session_helper.rb вы заметите, что signed_in_user вызывает store_location (закрытый метод), который обновляет session[:return_to] до текущего URL.

Итак, возвращаясь к разрушающему действию вашего контроллера, он пытается redirect_back_or, что приводит к GET current_url. Я изменил помощник signed_in_user так, чтобы он вызывал store_location только тогда, когда пользователь еще не вошел в систему.

1 голос
/ 20 сентября 2017

Поскольку браузеры не поддерживают глагол DELETE, Rails создает обходной путь для этой проблемы, имитируя запрос DELETE через стандартный GET или POST.method: :delete работает с помощью обработчика JavaScript для всех ссылок с data-method="delete", который изменяет запрос так, что Rails обрабатывает его как DELETE .Этот обработчик JavaScript предоставляется библиотекой jquery_ujs.

Есть несколько вещей, которые могли пойти не так:

  1. Убедитесь, что загружены jquery и jquery_ujsв вас application.js, поскольку без обоих ничего не будет обрабатываться ссылка.
  2. Убедитесь, что в данной ссылке действительно указана опция method: :delete.
  3. Убедитесь, что по какой-то причине вы этого не сделалиостановил распространение события рассматриваемой ссылки, например, так:
$( 'a' ).click( function( event ) {
    event.stopPropagation()
})

Так как это предотвратит выполнение обработчиков jquery_ujs и запрос никогда не будет изменен и останется простостандартный GET.

0 голосов
/ 19 июля 2018

На рельсах 5:

Возникла та же проблема, все посты 'УДАЛИТЬ' были скомпрометированы, что повлияло на мои грубые страницы И разработало выход ... чтобы решить проблему, все, что мне нужно было сделать, это:

// = требуется rails-ujs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...