यदि आप कोड को दो भागों में विभाजित करते हैं तो यह समझना आसान है।
पहला भाग $("#reviews").append("<%= ... %>");
एआरबी के साथ जावास्क्रिप्ट है। इसका मतलब है कि <%= ... %>
इसके बदले में रूबी कोड जो भी लौटाएगा, उसे प्रतिस्थापित कर दिया जाएगा। उस प्रतिस्थापन का परिणाम वैध जावास्क्रिप्ट होना चाहिए, अन्यथा जब यह क्लाइंट इसे संसाधित करने का प्रयास करता है तो यह एक त्रुटि फेंक देगा। तो यह पहली बात है: आपको मान्य जावास्क्रिप्ट की आवश्यकता है।
ध्यान में रखना एक और बात यह है कि जो भी रूबी उत्पन्न करता है उसे डबल कोट्स के साथ जावास्क्रिप्ट स्ट्रिंग के अंदर निहित होना चाहिए - <%= ... %>
के आसपास डबल कोट्स देखें। इसका मतलब है कि उत्पन्न जावास्क्रिप्ट इस तरह दिखेगा:
$("#reviews").append("...");
अब <%= ... %>
अंदर गहरे लाल रंग का हिस्सा जांच करते हैं। render(:partial => @review)
क्या करता है? यह आंशिक प्रतिपादन कर रहा है - जिसका अर्थ है कि यह किसी भी प्रकार का कोड - एचटीएमएल, सीएसएस ... या इससे भी अधिक जावास्क्रिप्ट प्रस्तुत कर सकता है!
तो, क्या होता है यदि हमारे आंशिक में कुछ सरल HTML शामिल है, तो इस तरह?
<a href="/mycontroller/myaction">Action!</a>
याद रखें कि आपका जावास्क्रिप्ट एक पैरामीटर के रूप में डबल-उद्धृत स्ट्रिंग ले रहा था? अगर हम उस आंशिक कोड के साथ <%= ... %>
को प्रतिस्थापित करते हैं, तो हमें एक समस्या है - href=
के तुरंत बाद एक डबल कोट है!जावास्क्रिप्ट मान्य नहीं होगा:
// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");
इस के लिए
आदेश में ऐसा नहीं है, तो आप भागने करने के लिए इन विशेष वर्ण चाहते हैं तो अपने स्ट्रिंग में कटौती नहीं कर रहा है - अगर आप कुछ है कि इस के बजाय उत्पन्न की जरूरत है:
<a href=\"/mycontroller/myaction\">Action!</a>
यह escape_javascript
करता है। यह सुनिश्चित करता है कि लौटाई गई स्ट्रिंग जावास्क्रिप्ट को "तोड़" नहीं देगी। यदि आप इसका उपयोग करते हैं, तो आपको वांछित आउटपुट मिलेगा:
$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")
सम्मान!
FYI का जावास्क्रिप्ट निष्पादित नहीं करेगा, यहां स्वीकृत उत्तर सही उत्तर नहीं है। किकिटो – Steve