2012-12-10 14 views
12

के अंतर्निहित निर्माण को रोकता है, इसलिए, यह एक दिलचस्प समस्या थी जिसमें मैं दौड़ रहा था।अपरिभाषित | 0 | संदर्भ त्रुटि: सख्त मोड वैश्विक संपत्ति 'csrf_token'

मैं वर्तमान में एक backbone.js - रेल ऐप बना रहा हूं। आम तौर पर सीखने के उद्देश्यों के लिए इसे बनाना। मैं (किसी भी अच्छे रेल देव की तरह) टीडीडी/बीडीडी में अपना सर्वश्रेष्ठ प्रदर्शन कर रहा हूं और मैं कैपिबरा के साथ एक समस्या में भाग गया।

मेरे पास एक एकीकरण नमूना है जो केवल 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 

मैं जैस्मीन, साइनऑन, और कैपिबारा/आरएसपीसी/वेबकिट के साथ परीक्षण चला रहा हूं। मैं thinkbot (रास्ते से भयानक पुस्तक) द्वारा "रुपये पर रूपेक्स" पुस्तक दोनों का पालन कर रहा हूं, और यह ट्यूटोरियल: 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' 

मैं इस बाहर छँटाई वास्तव में है क्योंकि वहाँ कुछ भी नहीं इस त्रुटि के लिए गूगल करने योग्य एक लंबे समय ले लिया।

आखिर में मैंने जेएस में "सख्त मोड का उपयोग" का उपयोग करके ठोकर खाई। अनिवार्य रूप से यह कुछ नए ईएमसीए 5 स्क्रिप्ट सम्मेलनों का उपयोग करेगा। यह अधिक कोडिंग ब्लूपर पकड़ लेगा, और आपको वैश्विक चरों तक पहुंचने से रोक देगा। सभी अच्छी चीज़ें।

तो मैं जाँच, और मेरे sinon.js फ़ाइल में, मैं देख रहा हूँ:

"use strict"; 

फ़ाइल की लाइन 36 पर। लो और देखो मैं लाइन पर टिप्पणी करता हूं, और मेरे परीक्षण ठीक काम करते हैं।

यहां मेरा प्रश्न है: सख्त गड़बड़ सीएसआरएफ का उपयोग क्यों किया? मुझे लगता है कि यह मेरे रेल लेआउट में csrf_meta_tags के साथ कुछ करने के लिए है। यदि संभव हो तो मैं इस लाइन को वापस साइनऑन जेएस में रखना चाहूंगा क्योंकि मुझे लगता है कि यह "सही काम करने के लिए"

क्या किसी के पास इस पर अधिक जानकारी है? मैं पहले से किसी भी विवरण की सराहना करता हूं !!

उत्तर

21

यह आपको बता रहा है कि csrf_token नामक एक चर को एक मूल्य असाइन किया जा रहा है जिसे घोषित नहीं किया गया है, उदा।

csrf_token = 'foo'; 

गैर सख्त मोड में, कि वैश्विक वस्तु (आमतौर पर एक वैश्विक चर कहा जाता है) का एक गुण पैदा करेगा csrf_token कहा जाता है जब कोड की है कि लाइन निष्पादित किया जाता है।

सख्त मोड में, यह आपके द्वारा देखी गई त्रुटि को फेंक देगा क्योंकि सख्त मोड वैश्विक चर के अंतर्निहित निर्माण को रोकता है। कोड त्रुटि से आता है, या पिछले स्क्रिप्ट तत्व के रूप में ही स्क्रिप्ट तत्व में एक वैश्विक संदर्भ में कहीं भी

var csrf_token; 

: तुम भी शामिल करके इसे ठीक कर सकता है।

संबंधित मुद्दे