रेल में, आप JSON को एक दृश्य का उपयोग करके कैसे प्रस्तुत करते हैं?


125

मान लीजिए कि आप अपने उपयोगकर्ता नियंत्रक में हैं और आप एक शो अनुरोध के लिए एक json प्रतिक्रिया प्राप्त करना चाहते हैं, तो अच्छा होगा यदि आप अपने विचारों / उपयोगकर्ताओं / dir में एक फ़ाइल बना सकें, जिसका नाम show.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

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


इस पोस्ट को देखते हुए, ऐसा लगता है कि यह मुझे ज्यादा नहीं बचाएगा, लेकिन मेरे पास और भी जटिल मामले हैं, मुझे विश्वास है जब मैं कहता हूं कि इससे मुझे सिरदर्द हो रहा है
मैथ्यू

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

जवाबों:


64

आपको अपने respond_toब्लॉक में ऐसा कुछ करने में सक्षम होना चाहिए :

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

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


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

1
क्या किसी आंशिक का उपयोग किए बिना इसे करने का कोई तरीका है?
व्यालियम जुड

55

एक दृश्य जोड़ने का प्रयास करें users/show.json.erbजब आप JSON प्रारूप के लिए अनुरोध करते हैं तो इसका प्रतिपादन किया जाना चाहिए, और आपको इसका अतिरिक्त लाभ erb द्वारा प्रदान किया जा रहा है, इसलिए आपकी फ़ाइल कुछ इस तरह दिख सकती है

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

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

1
आपको सिंगल कोट्स को डबल कोट्स में बदलना चाहिए, क्योंकि JSON (JS के विपरीत) केवल डबल-कोटेड स्ट्रिंग्स को स्वीकार करता है।
अबे वोल्कर

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

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन यह पूरी तरह से गलत है। to_json पहले से ही तैयार किए गए json स्ट्रिंग को लौटा देगा "", इसलिए परिणामस्वरूप json अतिरिक्त उद्धरणों ("" मान "") के साथ कभी मान्य नहीं होगा। इसके अलावा, यदि उपयोगकर्ता का पहला नाम शून्य है, तो परिणामी json में स्ट्रिंग "null" मान के रूप में होगा। इसके अलावा <% = html भागने का उपयोग करता है जो इनपुट डेटा में HTML वर्णों को मंगाएगा।
d4n3

मुझे लगता है कि आपको उद्धरण चिह्नों को हटाने की आवश्यकता है <%= xyz.to_json %>अन्यथा आप अतिरिक्त उद्धरणों के साथ छोड़ दिए जाते हैं।
akostadinov

32

जैसा कि दूसरों ने उल्लेख किया है कि आपको उपयोगकर्ताओं / show.json दृश्य की आवश्यकता है, लेकिन अस्थायी भाषा पर विचार करने के लिए विकल्प हैं ...

ERB

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

Rabl

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

JSON बिल्डर

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

सादा रूबी

रूबी JSON उत्पन्न करने में बहुत बढ़िया है और सीखने के लिए कुछ भी नया नहीं है क्योंकि आप to_jsonएक हैश या एआर ऑब्जेक्ट पर कॉल कर सकते हैं । बस टेम्प्लेट के लिए .rb एक्सटेंशन रजिस्टर करें (एक इनिशियलाइज़र में):

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

फिर व्यू यूजर्स बनाएं / show.json.rb:

@user.to_json

इस दृष्टिकोण के बारे में अधिक जानकारी के लिए http://railscasts.com/episodes/379-template-handlers देखें


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

1
इसके अलावा, इसे और अधिक अपडेट करने के लिए, json_builder को github.com/rails/jbuilder द्वारा सुपरक्रेड किया गया है ।
टिम डिगिन्स

27

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

RABL एक रत्न के माध्यम से उपलब्ध है या GitHub रिपॉजिटरी की जाँच करें; अच्छे उदाहरण भी

https://github.com/nesquena/rabl


21

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

रेल 3 में, आपको बस एक फ़ाइल बनाने की आवश्यकता है views/users/show.json.erb@userवस्तु को देखने के लिए उपलब्ध हो जाएगा (जैसे यह एचटीएमएल के लिए किया जाएगा।) तुम भी जरूरत नहीं है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 की आवश्यकता होती है तब response_with का उपयोग करते हैं respond_with @user, only: [:name]। अधिक जानकारी के लिए इस ट्यूटोरियल को देखें।
जेम्स लिम

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

10

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

<%= @user.to_json %>

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

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

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


0

RoR के लिए नया हूँ यह मुझे पता चला है। आप सीधे एक json प्रारूप प्रस्तुत कर सकते हैं

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.