Простое удаление AJAX в Rails 3 не работает, так как authenticity_token не отправляется с запросом - PullRequest
2 голосов
/ 23 апреля 2011

Я отправляю простой запрос на удаление ajax, например так:

#invitation_actions
  =link_to "delete", invitation_path(invitation), :method=>:delete, :remote=>true, :class=>"remove", :confirm=>'Are you sure you?'

Обратите внимание, что страница, содержащая запрос, содержит authenticity_token благодаря тегу csrf_meta_tag, который включен во все страницы.

Когда я просматриваю логи, я вижу, что в запросе на удаление отсутствует знак authenticity_token:

Запущен DELETE "/ invitations / 5" для 127.0.0.1 в 2011-04-22 11:21:21 -0700 Обработка с помощью InvitationsController # destroy as Parameters: {"id" => "5"}

Теперь, если я удаляю ": remote =>: true" из кода, т.е. я делаю обычную страницу, загружаюудаление работает, и я вижу следующее в файле журнала:

Запущен POST "/ invitations / 10" для 127.0.0.1 в 2011-04-22 12:52:19 -0700 Обработка в InvitationsController # уничтожить как HTMLПараметры: {"authenticity_token" => "qlT8uX / WGQeOQSmVZzw1v8rFdSTHDRbzNY0zpSc9mV0 =", "id" => "5"}

Почему это DELETE в случае AJAX и POST в не-A?Почему DELETE не включает в себя маркер authenticity_token?

Спасибо за любую помощь.

Ответы [ 2 ]

6 голосов
/ 23 апреля 2011

Первая возможная причина вашей проблемы (о которой я могу подумать) заключается в том, что если вашему UJS-скрипту более пары месяцев, вам может потребоваться обновить его до последней версии, чтобы приложение отправляло аутентичностьтокен с запросами AJAX.

Это изменение в поведении произошло в феврале 2011 года, что означало необходимость обновления всех сценариев Rails UJS:

http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2d95a3cc23e03665

Вторая частьвашего вопроса спрашивает об HTTP-глаголе POST, используемом для удаления, когда дело не в AJAX.Это связано с тем, что Rails должен имитировать обработку форм REST, поскольку браузеры не реализуют все 4 глагола HTTP, например, GET, POST, PUT & DELETE, поскольку эти глаголы недопустимы в HTML.

JavaScript (AJAX) можетделать реальные вещи, потому что он контролирует заголовки, которые отправляются на конечную точку AJAX.

1 голос
/ 07 октября 2013

Также вам нужно добавить <%= csrf_meta_tag %> внутри тега <head> вашего файла макета приложения. Этот помощник помещает пару дополнительных тегов <meta>, которые необходимы сценарию jquery_ujs для составления правильного запроса POST.

...