2013-07-22 4 views
22

जावास्क्रिप्ट ब्लॉक के अंदर रूबी की स्थिति डालने का एक तरीका है? यानीजावास्क्रिप्ट ब्लॉक के अंदर रूबी [पतला टेम्पलेट]

javascript: 
    var config = { 
     common_value_1 : 1, 
     common_value_2 : 2 
    }; 
    - if my_value === true # this must be a ruby condition 
    config.custom_true_value_1 = "1" ; 
    config.custom_true_value_2 = "#{my_value}" ; 
    - else 
    config.custom_false_value_1 = "1" ; 
    config.custom_false_value_2 = "#{my_value}" ; 

या इस समस्या पर कोई और कामकाज है? क्योंकि बदसूरत तरह से है कि मैं उपयोग कर सकते हैं अपने:

javascript: 
    var config = { 
     common_value_1 : 1, 
     common_value_2 : 2 
    }; 
- if my_value === true # this must be a ruby condition 
    javascript: 
    config.custom_true_value_1 = "1" ; 
    config.custom_true_value_2 = "#{my_value}" ; 
- else 
    javascript: 
    config.custom_false_value_1 = "1" ; 
    config.custom_false_value_2 = "#{my_value}" ; 

लेकिन मैं यह पसंद नहीं है क्योंकि config समान मूल्यों अगर और कुछ तो बीच मैं अपने कोड नकल होता है और बहुत बड़ा और बनाए रखने के लिए मुश्किल होगा है या नहीं।

बेहतर उदाहरण

+0

क्यों- अन्य भाग समान मान निर्दिष्ट करते हैं? क्या यह ठीक है? –

+1

शाब्दिक सत्य के खिलाफ परीक्षण करना एक अजीब चीज है। 'My_value' पर्याप्त क्यों नहीं है? – tadman

+0

मैं बस खुद को अच्छी तरह से समझा नहीं, अद्यतन प्रश्न देखें, धन्यवाद ... – norman784

उत्तर

26

आप एक शैली स्ट्रिंग लगाना के लिए इसी तरह उपयोग कर सकते हैं के साथ अपडेट किया। नीचे उदाहरण है।

javascript: 
    var config = { 
    custom: "#{my_value ? 'truthy' : 'falsy'}", 
    current_user: #{raw current_user.to_json} 
    }; 

** नीचे अद्यतन **

आप एक और अधिक उन्नत विन्यास मैं एक वर्ग बनाने के लिए सिफारिश करेंगे, उदाहरण के

class ClientConfig 
    attr_accessor :foo, :bar 

    # .. code 

    def to_json 
    { foo: foo, bar: bar }.to_json 
    end 
end 

# in view file 
javascript: 
    var config = ClientConfig.new.to_json 

वरना के लिए चाहते हैं तो आप भी एक बनाने का अवसर रूबी आंशिक मैंने नीचे एक उदाहरण बनाया है जो इतना सुंदर नहीं हो सकता है लेकिन मैं काम करता हूं।

# template_path/_config.html.ruby 
def configuration 
    { foo: "Hello", bar: "World" } 
end 

def july_special 
    { june_key: "It's June" } 
end 

def month_name 
    Date.today.strftime("%B") 
end 

config = month_name == 'July' ? configuration.merge(july_special) : configuration 

content_tag :script, config.to_json.html_safe 

# viewfile 
= render 'template_path/config' 

तो मेरी बात यह है कि थेरेस ऐसा करने का तरीके गुणा और आप जिस तरह से thats सूट आप और आपके आवेदन सबसे खोजने की कोशिश करनी चाहिए। मेरे मामले में मैं (अद्यतन करने से पहले) मेरा पहला उदाहरण का उपयोग करता है, तो मैं सिर्फ एक या दो मूल्यों की आवश्यकता बाकी मैं तुम्हें raw और न ही html_safe नहीं है वर्ग ClientConfig

+0

अगर मैं प्रत्येक मामले में अलग-अलग कुंजी जोड़ना चाहता हूं, तो मैं अपना प्रश्न अपडेट करता हूं, ऐसा लगता है कि मैं स्वयं को पहले अच्छी तरह से समझा नहींता कुछ और विकल्पों के लिए समय – norman784

+0

से अद्यतन उत्तर। – aross

+0

मुझे उचित लगता है ... धन्यवाद ... – norman784

12

शुद्ध स्लिम में लिए जाने के होगा।

1. एक ruby अनुभाग

इस परिदृश्य जटिल कोड के लिए बेहतर है उपयोग:

javascript: 
    var data = #{{ JSON.dump([{x: 1, y:2}]) }}; 
+1

यह सबसे सरल और सबसे सटीक उत्तर है। –

3

आप 2 विकल्प हैं: उन मामलों में, बस प्रलेखित here के रूप में दोहरा घुंघराले ब्रेसिज़ का उपयोग करें।

मेरे पास एक रूबी ऑब्जेक्ट है जिसे मैं JSON बनाना चाहता हूं। html_safe को

ruby: 

    myObject = @object.to_json.html_safe 

वेतन ध्यान:: तो, मेरी पतली फाइल के अंदर मैं एक ruby अनुभाग पैदा हो जाएगी यह महत्वपूर्ण है दोहरे उद्धरण चिह्नों से बच नहीं सकते हैं।

तो फिर तुम javascript खंड के अंदर myObject उपयोग कर सकते हैं:

javascript: 

    var data = #{myObject}; 

2. उपयोग डबल घुंघराले ब्रेसिज़

सरल मामलों के लिए, javascript खंड के अंदर डबल घुंघराले ब्रेसिज़ का उपयोग करें, @fphilipe जवाब में कहा गया है की तरह :

javascript: 

    var data = #{{@object.to_json}}; 
+1

मुझे आश्चर्य है कि इंटरनेट पर खोजना इतना कठिन है। धन्यवाद @ इज़राइल। –

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