यह समझना आसान है कि क्या आप कोड को दो भागों में विभाजित करते हैं।
पहला भाग $("#reviews").append("<%= ... %>");erb के साथ जावास्क्रिप्ट है। इसका मतलब यह है कि इसके <%= ... %>अंदर जो भी रूबी कोड होगा, उसे बदल दिया जाएगा। उस प्रतिस्थापन का परिणाम मान्य जावास्क्रिप्ट होना चाहिए, अन्यथा जब ग्राहक इसे संसाधित करने का प्रयास करता है तो यह एक त्रुटि फेंक देगा। तो यह पहली बात है: आपको वैध जावास्क्रिप्ट की आवश्यकता है ।
एक और बात ध्यान में रखना है कि जो भी रूबी उत्पन्न होता है, उसे दोहरे उद्धरण चिह्नों के साथ जावास्क्रिप्ट स्ट्रिंग के अंदर समाहित किया जाना चाहिए - को दोहरे उद्धरण चिह्नों पर ध्यान दें <%= ... %>। इसका मतलब यह है कि उत्पन्न जावास्क्रिप्ट इस तरह दिखेगा:
$("#reviews").append("...");
अब चलो अंदर माणिक भाग की जांच करते हैं <%= ... %>। क्या करता render(:partial => @review)है? यह एक आंशिक प्रतिपादन कर रहा है - जिसका अर्थ है कि यह किसी भी प्रकार का कोड प्रदान कर सकता है - html, css ... या इससे भी अधिक जावास्क्रिप्ट!
तो, क्या होता है अगर हमारे आंशिक में कुछ सरल 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>")
सादर!