Undefined | 0 | ReferenceError: Строгий режим запрещает неявное создание глобального свойства 'csrf_token'
Итак, это была довольно интересная проблема, с которой я столкнулся.
В настоящее время я создаю приложение backbone.js - Rails. Как правило, это делается для обучения. Я (как и любой хороший рельс dev) прилагаю все усилия в TDD/BDD, и у меня возникла проблема с capybara.
У меня есть спецификация интеграции, которая просто проверяет работу root_path (начинается история базы данных, отображает начальную информацию и т.д.).
require 'spec_helper'
describe "RentalProperties", js: true do
describe "GET /" do
it "should show a list of properties" do
visit root_path
eventually{page.should have_content("Something")}
end
end
end
Я запускаю тесты с жасмином, синоном и capybara/rspec/webkit. Я свободно слежу за книгой "Rspec on Rails" от мыслителя (кстати, замечательная книга), и этот урок: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html.
При запуске указанной спецификации я наткнулся на эту ошибку:
undefined|0|ReferenceError: Strict mode forbids implicit creation of global property 'csrf_token'
Я долгое время разбирался в этом, потому что на эту ошибку действительно ничего не было.
В конце концов я наткнулся на использование "строгого режима" в JS. По сути, это будет использовать некоторые новые соглашения EMCA5 script. Он будет захватывать больше кодирования bloopers и не позволит вам получить доступ к глобальным переменным. Все хорошие вещи.
Итак, я проверяю, и в моем файле sinon.js я вижу:
"use strict";
в строке 36 файла. Lo и вот я прокомментирую строку, и мои тесты работают очень хорошо.
Вот мой вопрос: зачем использовать строгий беспорядок csrf? Я предполагаю, что это имеет какое-то отношение к csrf_meta_tags в моем рельсовом макете. Если возможно, я хотел бы вернуть эту строку в синус js, поскольку я предполагаю, что это "правильная вещь"
Есть ли у кого больше информации об этом? Я ценю любые детали заранее!
Ответы
Ответ 1
Сообщает вам, что значение присваивается переменной с именем csrf_token
, которая не была объявлена, например.
csrf_token = 'foo';
В нестрогом режиме это создаст свойство глобального объекта (обычно называемого глобальной переменной), называемого csrf_token
, когда выполняется эта строка кода.
В строгом режиме он выдает ошибку, которую вы видите, потому что строгий режим предотвращает неявное создание глобальных переменных. Вы также можете исправить это, включив:
var csrf_token;
в любом месте глобального контекста в том же элементе script, что и код ошибки, или предыдущий элемент script.