ROR

2011-01-16 14 views
45

में जावास्क्रिप्ट और HAML में वेरिएबल मानों को इंजेक्शन देना मेरे पास ज़ेनडेस्क का उपयोग करने के लिए निम्न कार्य है। मैं अपने वर्तमान_user विवरण को इस रूप में फॉर्म में इंजेक्ट करना चाहता हूं। (यह html.haml टेम्पलेट से मेरा है)। हालांकि मैं यह नहीं समझ सकता कि यह काम कैसे करें।ROR

:javascript 
    if (typeof(Zenbox) !== "undefined") { 
     Zenbox.init({ 
     dropboxID: "xxxxx", 
     url:   "xxxxx.zendesk.com", 
     tabID:  "support", 
     tabColor: "black", 
     tabPosition: "Left", 
     requester_name: =current_user ? "#{current_user.first_name} #{current_user.last_name}" : "" , 
     requester_email: =current_user ? "#{current_user.email}" : "" , 
     hide_tab: true 
     }); 
    } 

संक्षेप में, कैसे एक रैल चर को इंजेक्ट करता है: हैम्ल में जावास्क्रिप्ट तत्व।

+0

उत्तर HAML के बिना समान होंगे: http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –

उत्तर

54

यह काम करना चाहिए यानी। सरल स्ट्रिंग्स के लिए

requester_name: "#{current_user.first_name + ' ' + current_user.last_name if current_user}", 
requester_email: "#{current_user.email if current_user}", 
+0

और विपरीत दिशा के बारे में कैसे? यानी : जावास्क्रिप्ट # {कच्चे some_helper (जेएस से यहां तर्क)} – januszm

+0

जावास्क्रिप्ट ब्राउज़र पर एक ब्राउज़र और रूबी में चलता है ताकि आप इसे ऐसा नहीं कर सकें। – Heikki

20

प्रत्यक्ष #{} काम करता है, लेकिन सामान्य रूप में सबसे स्केलेबल/सुरक्षित समाधान नहीं है: #{} के अंदर सभी इनलाइन माणिक डाल दिया।

उदाहरण के लिए, रूबी में शाब्दिक बैकस्लैश आप जहां यह एक नई पंक्ति चरित्र के रूप में व्याख्या की जाएगी जावास्क्रिप्ट में समस्याओं का कारण होगा:

- a = "\\n" 
:javascript 
    '#{ a }' !== "\\n" 

this awesome Rails cast से, निम्न तकनीक का इस्तेमाल किया जा सकता है:

escape_javascript

उपनाम: j

केवल स्ट्रिंग पर काम करता है।

जावास्क्रिप्ट स्ट्रिंग्स शाब्दिक उद्धरणों के अंदर रखने के लिए उपयुक्त प्रारूप में बैकस्लैश एस्केप की तरह, जावास्क्रिप्ट स्ट्रिंग्स, जैसे विशेष अर्थों में वर्णों से बच सकते हैं।

इनपुट के html_safe स्थिति को बनाए रखने, तो html_safe< तरह अन्यथा विशेष HTML वर्ण &lt; में भाग निकले जायेगा की जरूरत है।

- a = "\\n<" 
:javascript 
    '#{ j(a)   }' === '\\n&lt;' 
    '#{ j(a).html_safe }' === '\\n<' 

to_json + html_safe

वर्क्स क्योंकि JSON almost a subset of Javascript object literal notation है।

स्ट्रिंग्स, सरणी और पूर्णांक सहित किसी भी हैश ऑब्जेक्ट पर काम करता है जो संबंधित डेटा प्रकार के JSON खंडों में कनवर्ट किया गया है।

- data = { key1: 'val1', key2: 'val2' } 
:javascript 
    data = #{ data.to_json } 
    data.key1 === 'val1' 
    data.key2 === 'val2' 

डेटा- विशेषताओं

जावास्क्रिप्ट डोम संचालन के साथ विशेषताओं के मान जोड़ें, उन्हें पुनः प्राप्त। content_tag सहायक के साथ

बेहतर:

= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} 
:javascript 
    $('#data').data('key1') === 'val1' 
    $('#data').data('key2') === 'val2' 

gon

नौकरी के लिए लाइब्रेरी विशेष: https://github.com/gazay/gon

शायद सबसे मजबूत समाधान।

Gemfile:

gem 'gon' 

नियंत्रक:

gon.key1 = 'val1' 
gon.key2 = 'val2' 

लेआउट app/views/layouts/application.html.erb:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <%= include_gon %> 

दृश्य:

:javascript 
    gon.key1 === 'val1' 
    gon.key2 === 'val2' 
+2

डाउनवॉटर कृपया समझाएं ताकि मैं जानकारी में सुधार कर सकूं। मैं कभी प्रतिशोध नहीं करता हूं। धन्यवाद। –

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