Маркер подлинности Rails недействителен при использовании другого макета

У меня есть приложение rails, которое использует модальные для отправки данных на контроллер и сохранения их в базе данных. Поток работает отлично при использовании моего старого "оригинального" макета, но после реализации нового макета на основе начальной загрузки, когда я пытаюсь подтвердить, что получаю недопустимую ошибку CRSF.

Если я верну оригинальную компоновку на контроллере, она будет работать нормально.

JS, который запускает этот метод click / post, выглядит следующим образом:

$(document).on("click",".clickable", function(){
  var link = $(this).data('link')
    console.log(link);
    $.ajax({
      url: link,
      type: "POST",
    });
});

Ничто в коде не меняется, кроме макета для контроллера, и, как я уже говорил, если я верну макет обратно к исходному, он будет работать просто отлично. Мог ли я пропустить файл javascript или что-то еще в javascript нового макета?

Новый макет файла js: stack.js

//= require jquery3
//= require popper
//= require rails-ujs
//= require bootstrap
//= require stack/vendors/vendors.min
//= require stack/vendors/charts/raphael-min
//= require stack/vendors/charts/morris.min
//= require stack/vendors/extensions/unslider-min
//= require stack/vendors/timeline/horizontal-timeline
//= require stack/core/app-menu
//= require stack/core/app
//= require stack/scripts/pages/dashboard-ecommerce
//= require_tree ./common

Старый макет файла js: application.js

//= require jquery3
//= require popper
//= require rails-ujs
//= require bootstrap
//= require_tree ./common

Все js-файлы, специфичные для нового шаблона, находятся в папке "stack" в главной папке javascripts, поэтому только./common включен выше. Я не хотел, чтобы все файлы в стеке были включены, так как есть много файлов, которые я еще не подключил или не удалил.

Какие-нибудь мысли?

Ошибка:

    Started POST "/add_interest?city_id=59020&name=Mission+District%2C+San+Francisco%2C+California%2C+US&region_id=128085&type=region" for 127.0.0.1 at 2019-02-16 13:30:02 -0800
Processing by InterestsController#create as */*

      Parameters: {"city_id"=>"59020", "name"=>"Mission District, San Francisco, California, US", "region_id"=>"128085", "type"=>"region"}
    Can't verify CSRF token authenticity.
    Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)



    ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:
`

2 ответа

Решение

Поскольку вы используете Rails-ujs, вы можете использовать его ajax метод, который уже обрабатывает токен для вас:

https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/utils/ajax.coffee

$(document).on("click",".clickable", function(){
  var link = this.dataset.link;
  console.log(link);
  Rails.ajax({
    url: link,
    type: "POST",
  });
});

Попробуйте вот так:

$(document).on("click",".clickable", function(){
  var link = $(this).data('link')
    console.log(link);
    $.ajax({
      url: link,
      beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
      method: "POST",
      dataType: "json",
      data: {}
    });
});
Другие вопросы по тегам