2010-04-26 17 views
17

एक्शन व्यू में escape_javascript विधि एस्ट्रोफ़े ' बैकस्लैश एस्ट्रोफ़े \' के रूप में बचती है, जो JSON के रूप में पार्स करते समय त्रुटियां देती है।Rails escape_javascript एकल उद्धरण से बचकर अमान्य JSON बनाता है

{"message": "I'm here"} 

लेकिन, <%= escape_javascript("I'm here") %> आउटपुट "I\'m here", अमान्य JSON में जिसके परिणामस्वरूप:

उदाहरण के लिए, संदेश "मैं यहाँ हूँ" मान्य JSON जब के रूप में मुद्रित है

{"message": "I\'m here"} 

वहाँ एक है इसे ठीक करने के लिए पैच, या JSON पर प्रिंट करते समय स्ट्रिंग से बचने का एक वैकल्पिक तरीका?

उत्तर

10

बस एक स्ट्रिंग पर .to_json को कॉल करें और यह ठीक से बच जाएगा।

"foo'bar".to_json 
+1

यह काम नहीं करता है यदि स्ट्रिंग उदाहरण के लिए HTML है और उदाहरण के लिए स्ट्रिंग में डबल कोट्स हैं। – margusholland

+1

@margusholland - सच नहीं - .to_json पूरी तरह से डबल कोट्स से बचने के लिए हैंडल – Neall

+0

'" foo'bar ".to_json' आउटपुट' "foo'bar" ' –

3

मई यहां अधिक जानकारी चाहिए, लेकिन JSON तारों को डबल कोट्स का उपयोग करना चाहिए। एकल उद्धरण जावास्क्रिप्ट तारों में ठीक है, लेकिन JSON में नहीं।

JSON_ESCAPE_MAP = { 
    '\\' => '\\\\', 
    '</' => '<\/', 
    "\r\n" => '\n', 
    "\n" => '\n', 
    "\r" => '\n', 
    '"'  => '\\"' } 

def escape_json(json) 
    json.gsub(/(\\|<\/|\r\n|[\n\r"])/) { JSON_ESCAPE_MAP[$1] } 
end 

कोई भी इस से बेहतर वैकल्पिक हल के बारे में पता:

+0

प्रतिक्रिया के लिए धन्यवाद - मैं स्पष्टता के लिए एक उदाहरण गयी। – Arrel

6

मैं escape_javascript विधि ActionView::Helpers::JavaScriptHelper में पाया के आधार पर मेरे application_helper.rb के लिए एक नया escape_json विधि जोड़ने समाप्त हो गया?

+1

मुझे रेल के बारे में बहुत कुछ पता नहीं है। लेकिन क्या आप किसी भी तरह से 'रेंडर: जेसन' का उपयोग कर सकते हैं जैसा कि http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-json और http://api.rubyonrails.org/classes/ActionController/Base पर वर्णित है। एचटीएमएल –

+0

वह वस्तुओं को बदलने के लिए काम करता है, लेकिन तारों के बारे में निश्चित नहीं है। मैं इसे देख लूंगा ... – Arrel

+0

केवल एक चीज जो मैंने अभी तक पाई है, काम किया है। यकीन नहीं है कि क्यों to_json डबल के बजाय एक बैकस्लैश के साथ उद्धरण से बचने का फैसला करता है लेकिन मुझे थोड़ी देर के लिए था। धन्यवाद। – dChimento

5

मैं इस, जहां मैं जावास्क्रिप्ट एक रेल टेम्पलेट, जो बाद में पुनः प्राप्ति और उपयोग के लिए jQuery.data में तार डाल के तल पर आदेश डाल करने के लिए आवश्यक करने के लिए इसी तरह के कुछ मुद्दों पर था।

जब भी मेरे पास स्ट्रिंग में एकल-कोट था, तो मुझे पृष्ठ लोड करने पर एक जावास्क्रिप्ट त्रुटि प्राप्त होगी।

यहाँ मैं क्या किया है:

-content_for :extra_javascript do 
    :javascript 
    $('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}"); 
संबंधित मुद्दे