Подтвердить что ты не робот

ActionController:: InvalidAuthenticityToken при отключении запроса JS/Ajax

У меня две формы с опцией remote: true; один отправляет запрос Ajax на действие create, а другой отправляет запрос Ajax на действие destroy.

Все рабочие штрафы, когда JavaScript включен, но если я отключу JavaScript, то я нажму, я получаю эту ошибку:

ActionController::InvalidAuthenticityToken PersonsController#create

Почему эта ошибка показана и как ее исправить?

Примечание: я использую Rails 4

Update

Когда я использую обычную форму без опции remote: true, рельсы автоматически вставляют скрытое поле для токена аутентификации, но когда я использую remote: true в моей форме, в коде HTML нет такого поля. Похоже, когда есть опция remote, тогда Rails по-разному обрабатывает токен аутентификации, так как я могу заставить это работать в обоих случаях?

4b9b3361

Ответ 1

В Bizarrely это поведение было изменено в rails 4. http://www.alfajango.com/blog/rails-4-whats-new/

Формы Rails теперь не будут отображать поле CSRF в форме, если вы явно не определяете его как вариант для вашей формы:

<%= form_for @some_model, :remote => true, :authenticity_token => true do |f| %>
<% end %>

Добавление этой опции позволяет изящно деградировать в резерв HTML, если Javascript отключен.

Ответ 2

У меня тоже была та же проблема. Я использовал form_tag для создания пользовательской удаленной формы, но я получил следующую ошибку:

 ActionController::InvalidAuthenticityToken

Я обнаружил, что это связано с тем, что по умолчанию в рельсе 4 не добавляется аутентичность toke, поэтому я добавил следующую строку в файл application.rb,

 config.action_view.embed_authenticity_token_in_remote_forms = true

который автоматически проверяет токен при отправке удаленных форм. Это решает проблему для меня. Надеюсь, это поможет кому-то.

Ответ 3

В моем случае мне просто нужно было добавить эту строку на моей странице:

 <%= csrf_meta_tags %>

Ответ 4

Если в форме нет поля csrf (скрытое поле), представление не может быть аутентифицировано сервером Rails.

Если вы сделаете форму form_tag, это произойдет. Лучше использовать form_for для ресурса (новый объект или существующий объект в db), и поле csrf будет автоматически создано Rails.

Ответ 5

Знаете ли вы, что эти функции были добавлены для защиты и защиты подделок.
Однако, чтобы ответить на ваш вопрос, вот некоторые материалы. Вы можете добавить эти строки после имени контроллера.

Таким образом,

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

Вот несколько строк для разных версий рельсов.

Рельсы 3

skip_before_filter: verify_authenticity_token

Rails 4:

skip_before_action: verify_authenticity_token


Если вы намерены отключить эту функцию безопасности для всех подпрограмм контроллера, вы можете изменить значение protect_from_forgery на : null_session в файле application_controller.rb.

Таким образом,

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end