2010-01-18 15 views
118

मान लीजिए कि आप अपने उपयोगकर्ता नियंत्रक में हैं और आप शो अनुरोध के लिए जेसन प्रतिक्रिया प्राप्त करना चाहते हैं, तो यह अच्छा होगा अगर आप अपने विचार/उपयोगकर्ता/डीआईआर में एक फाइल बना सकते हैं, जिसे show.json नाम दिया गया है और आपके उपयोगकर्ताओं के बाद # शो कार्रवाई पूरी हो गई है, यह फ़ाइल प्रस्तुत करता है।रेल में, आप एक दृश्य का उपयोग करके JSON कैसे प्रस्तुत करते हैं?

वर्तमान में आप की तर्ज पर कुछ करने की जरूरत है:

def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json{ 
     render :json => @user.to_json 
    } 
    end 
end 

लेकिन यह अच्छा नहीं है, तो आप सिर्फ एक show.json फ़ाइल जो स्वचालित रूप से इसलिए की तरह बनाए हो जाता है बना सकते हैं:

def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json 
    end 
end 

यह मुझे बहुत दुःख बचाएगा, और जब मैं अपने जेसन को नियंत्रक

+0

अब इस पोस्ट को देखते हुए, ऐसा लगता है कि इससे मुझे ज्यादा बचाया नहीं जा सकता है, लेकिन मेरे पास अधिक जटिल मामले हैं, जब मेरा कहना है कि यह मुझे सिरदर्द कर रहा है – Matthew

+1

रेल 3 में, आप बस 'format.json' को कॉल कर सकते हैं एक 'show.json.erb' फ़ाइल। मेरा जवाब देखें –

उत्तर

61

में कुछ करने में सक्षम होना चाहिए, तो मुझे उस बहुत गंदे अनुभव को दूर कर देगा। अपने respond_to ब्लॉक में रों:

format.json render :partial => "users/show.json" 

जो app/views/users/_show.json.erb में टेम्पलेट प्रस्तुत करना होगा।

+5

यह अच्छा है, लेकिन आप जल्द ही पता लगाएंगे कि जेसन जेसन उत्पन्न करने का एक दर्दनाक तरीका है। कुछ विकल्पों के लिए मेरा जवाब देखें। – tybro0103

+1

आंशिक उपयोग किए बिना इसे करने का कोई तरीका है? –

53

जब आप JSON प्रारूप के लिए एक अनुरोध बनाने के लिए, और आप का यह ERB द्वारा प्रदान की गई किया जा रहा अतिरिक्त लाभ मिलता भी है, तो आपकी फ़ाइल इस

{ 
    "first_name": "<%= @user.first_name.to_json %>", 
    "last_name": "<%= @user.last_name.to_json %>" 
} 
की तरह कुछ दिखाई दे सकता है एक दृश्य users/show.json.erb यह रेंडर किया जाना चाहिए जोड़ने का प्रयास करें
+9

आप 'escape_javascript' के बजाय' @ user.first_name.to_json' का उपयोग करना चाह सकते हैं। जेएस क्या अनुमति देता है और कड़ाई से * जेएसओएन के बीच कुछ सूक्ष्म मतभेद हैं। (और वे अंतर महत्वपूर्ण हो रहे हैं क्योंकि ब्राउज़र अपने स्वयं के JSON पार्सर्स को लागू करते हैं।) –

+0

सुझाव के लिए धन्यवाद; मैंने जवाब अपडेट किया। – erik

+1

आपको शायद एकल कोट्स को डबल कोट्स में बदलना चाहिए, क्योंकि JSON (जेएस के विपरीत) केवल डबल-उद्धृत स्ट्रिंग स्वीकार करता है। –

9

बस सामग्री के साथ show.json.erb फ़ाइल जोड़ने

<%= @user.to_json %> 

कभी कभी यह उपयोगी है आपको कुछ अतिरिक्त सहायक तरीकों कि नियंत्रक में उपलब्ध नहीं हैं, यानी image_path(@user.avatar) या कुछ और की जरूरत है जब अतिरिक्त उत्पन्न करने के लिए JSON में गुण:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %> 
+7

एचटीएमएल से बचने से बचने के लिए इसे '<% = कच्चे (@ user.to_json)%>' होना चाहिए। मैं क्या करता हूं कि जब तक यह मुझे वह चाहिए जो मुझे देता है, तब तक मैं to_json पर भरोसा करता हूं, लेकिन जब मैं कुछ और करना चाहता हूं तो मैं इसे आमतौर पर '{: blah => @ user.the_blah} .to_json' के साथ टेम्पलेट करता हूं। – clacke

27

Rabl शायद कि मैंने देखा है आप के लिए एक क्लीनर विकल्प के लिए देख रहे हैं यह करने के लिए सबसे अच्छा समाधान है ईआरबी वाक्यविन्यास। json_builder और argonaut, जो अन्य समाधान हैं, दोनों कुछ हद तक पुराने लगते हैं और कुछ पैचिंग के बिना रेल 3.1 के साथ काम नहीं करेंगे।

आरएबीएल एक मणि के माध्यम से उपलब्ध है या गिटहब भंडार की जांच करें; अच्छे उदाहरण भी

https://github.com/nesquena/rabl

21

बस जो दूसरों को इस पृष्ठ पर खत्म होता है के लिए इस उत्तर अद्यतन करने के लिए।

रेल 3 में, आप बस views/users/show.json.erb पर एक फ़ाइल बनाने के लिए की जरूरत है। @user ऑब्जेक्ट दृश्य में उपलब्ध होगा (जैसा कि यह HTML के लिए होगा।) आपको अब भी to_json की आवश्यकता नहीं है।

संक्षेप में, यह सिर्फ

# users contoller 
def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json 
    end 
end 

और

/* views/users/show.json.erb */ 
{ 
    "name" : "<%= @user.name %>" 
} 
+1

मैंने इस 1.5 साल पहले उत्तर दिया था। आजकल जब भी मुझे JSON की आवश्यकता होती है तो मैं answer_with का उपयोग करता हूं उदा। 'answer_with @user, केवल: [: name]'। अधिक जानकारी के लिए इस [ट्यूटोरियल] (http://bendyworks.com/geekville/tutorials/2012/6/respond-with-an-explanation) का संदर्भ लें। –

+1

बस इस जवाब में जोड़ने के लिए, यह वास्तव में दो कारणों के लिए खतरनाक है: यह उपयोगकर्ता डेटा से इंजेक्शन की अनुमति देता है, क्योंकि यह नई-पंक्तियों और बैकस्लैश, और भी बच नहीं होता <% = एचटीएमएल तो जैसे डेटा निकल जाता है शॉन ओ'कोनर का नाम शॉन ओ ' कॉनर से घिरा होगा। – d4n3

28

दूसरों का उल्लेख किया है के रूप में आप एक उपयोगकर्ता/शो की जरूरत है।json देखने के लिए, लेकिन वहाँ विकल्पों templating भाषा के लिए विचार करने के लिए ...

ERB

बॉक्स से बाहर काम करता है कर रहे हैं। एचटीएमएल के लिए बढ़िया है, लेकिन आप जल्द ही JSON के लिए यह भयानक पाएंगे।

RABL

अच्छा समाधान। एक निर्भरता जोड़ना और इसके डीएसएल सीखना है।

JSON Builder Rabl रूप

एक ही सौदा: अच्छा समाधान। एक निर्भरता जोड़ना और इसके डीएसएल सीखना है।

सादा रूबी

रूबी JSON पैदा भयानक है और वहाँ के रूप में आप एक हैश या एक एआर वस्तु पर to_json कॉल कर सकते हैं जानने के लिए कोई नई बात नहीं है।

ActionView::Template.register_template_handler(:rb, :source.to_proc) 

तब दृश्य उपयोगकर्ताओं/show.json.rb बनाने के लिए:: बस टेम्पलेट्स के लिए .rb विस्तार (एक प्रारंभकर्ता में) रजिस्टर इस दृष्टिकोण पर अधिक जानकारी के लिए

@user.to_json 

देख http://railscasts.com/episodes/379-template-handlers

+7

ध्यान दें कि रेल 4 में, .ruby टेम्पलेट हैंडलर डिफ़ॉल्ट https://github.com/rails/rails/commit/de1060f4e02925c12004f2 द्वारा पंजीकृत है ताकि आप .rb पंजीकरण के छोड़ सकते हैं और अपनी फ़ाइल उपयोगकर्ताओं/show.json.ruby नाम कर सकते हैं। –

+1

इसके अलावा, इसे और अपडेट करने के लिए, json_builder को https://github.com/rails/jbuilder द्वारा अतिस्थापित किया गया है। –

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