2009-03-03 19 views
18

मैं अपने रेल ऐप में JSON के माध्यम से एक पूर्ण लेख के साथ सभी लेखों का एक इंडेक्स प्रस्तुत करना चाहता हूं, लेकिन मुझे यह समझने में थोड़ा परेशानी हो रही है कि इसे कैसे किया जाए। एक ही रास्ता मैंरेल पर रूबी उन्नत JSON Serialization

@index = Article.find(:all, :select => 'id, title') 

:

if params[:id] 
    @article = Article.find(params[:id]) 
else 
    @article = Article.published.not_draft.by_recent.first 
end 

respond_to do |format| 

format.js { render :json => @article.to_json(
:except => [ :created_at, :updated_at, :draft, :id, :publish ], 
:include => { 
    :comments => { 
     :only => [:body] 
    } 
}), 
:callback => params[:callback]} 
end 

मैं जवाब में क्या करना चाहते हैं क्या सभी लेख के एक सूचकांक जोड़ते हैं, ताकि तरह है:

यहाँ अब मेरे नियंत्रक है मैं इसे करने में सक्षम हूं, इंडेक्स और आलेख दोनों को हैश या सरणी में डाल दिया गया है और फिर इसे JSON पर रखा गया है। दोनों के साथ

@response = { :item => @article, :index => @index } 

पूर्ण कोड:

@index = Article.find(:all, :select => 'id, title') 

if params[:id] 
    @article = Article.find(params[:id]) 
else 
    @article = Article.published.not_draft.by_recent.first 
end 

@response = { :item => @article, :index => @index } 

respond_to do |format| 

format.js { render :json => @response.to_json(), :callback => params[:callback]} 

end 

इस को छोड़कर अब मैं :include या :except निर्दिष्ट नहीं कर सकते और यह ठीक से प्रस्तुत करने के लिए मिलता है, ठीक होगा।

उत्तर

1

तुम इतनी तरह घोंसला :include, :except, आदि के लिए सक्षम होना चाहिए:

:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}... 

यदि वह काम नहीं करता है, यह एक वस्तु (जैसे एक OpenStruct) एक हैश के बजाय बनाते हैं।

- मार्कस

2

बस स्पष्ट कोड ऊपर के साथ काम करता हो: शामिल हैं और: को छोड़कर। और कामों से मेरा मतलब है कि यह एक त्रुटि फेंक नहीं है। समस्या यह है कि इसमें सूचकांक में प्रत्येक लेख के लिए टिप्पणियां शामिल हैं। मैं केवल आइटम के लिए टिप्पणियां शामिल करना चाहता हूं और इंडेक्स में सूचीबद्ध लेखों में से कोई भी नहीं।

मुझे हैश या ओपनस्ट्रक्चर ऑब्जेक्ट के रूप में काम करने के लिए घोंसला नहीं मिल सका।

पर भरोसा करना: इसमें कोई त्रुटि फेंकना, घोंसला देना शामिल है: सिवाय इसके कि कोई त्रुटि नहीं फेंकती है, लेकिन कुछ भी फ़िल्टर नहीं किया जाता है,: create_at, आदि अभी भी दिखाई देता है।

... 

@response = { :item => @article, :index => @index } 

format.js { render :json => @response.to_json(
:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}, 
:include => { :item => { 
     :comments => { 
       :only => [:body] 
     } 
}}), 
:callback => params[:callback]} 
end 
1

to_json एक है: विधि विकल्प है कि किसी भी तरीके से आप नाम का परिणाम भी शामिल है, आपको लगता है कि मॉडल है कि अतिरिक्त डेटा आप चाहते हैं देता है आपके JSON में पर एक विधि को परिभाषित कर सकते हैं।

28

आप अपने प्रश्न में समाधान पर संकेत देते हैं। आप शायद जेएसओएन को प्रस्तुत करने के लिए हैश बनाना चाहते हैं। ऐसा करने का पसंदीदा तरीका as_json विधि के लिए कार्यान्वयन प्रदान करना है। as_json एक हैश बनाने के लिए to_json आउटपुट को अनुकूलित करने का औपचारिक माध्यम प्रदान करता है जिसमें वह डेटा है जिसे आप एन्कोड करना चाहते हैं।

Jonathan Julian's weblog पर as_json और to_json इंटरैक्ट कैसे प्राप्त किया जा सकता है इसका एक और अधिक संपूर्ण उपचार।

1

(एक जवाब कृपया स्वीकार करें)

मुझे लगता है कि लिंक है कि nirvdrum दिया आपका जवाब रखती है। मैं केवल जवाब देता हूं क्योंकि किसी ने encode_json का उल्लेख नहीं किया है।

आपके मामले में आपको केवल as_json से निपटना चाहिए।या तो एक हैश (as_json पर विभिन्न कॉल के साथ) और render :json => ... (to_json पर कॉल किए बिना) या अपने मॉडल पर as_json को लागू करके और रेल को सभी काम करने के लिए भेजकर। क्या तुम सच में अपने गाया जवाब में कुछ फैंसी js की जरूरत है तो आप अपनी कक्षाओं में encode_json (फिर से, नहीं to_json) लागू कर सकते हैं (लेकिन मुझे लगता है आप पूर्व की आवश्यकता होगी।)

। उदाहरण के लिए:

class JsEmptyClosure 
    def encode_json(*args) 
    "jQuery[\"noop\"] || function(){}" 
    end 
    def as_json(*args) self end 
end 

यह अब मान्य जे एस के साथ to_json का जवाब (लेकिन यह वास्तव में json नहीं है ध्यान दें) होगा।

0

प्रश्न के लिए धन्यवाद, मैं कई एसोसिएशन के साथ एक मॉडल के लिए अपने जेसन प्रारूप को अनुकूलित करने में सक्षम हूं।

json प्रस्तुत करना: @ posts.to_json (

: = छोड़कर> [: created_at,: updated_at,: user_id],

: शामिल हैं => {

: उपयोगकर्ता => {: केवल => [: ईमेल,: फोन]},

: स्थान => {: केवल => [: शीर्षक,: lat,: lon,: सड़क,: शहर,: राज्य, : ज़िप कोड] },

,210

: अपलोड => {: केवल => [: छवि]}

}
)

0

मैं गुण विधि ओवरलोडिंग एक alternat हैश कि स्वचालित रूप से to_json उत्पादन में इस्तेमाल किया जाएगा वापस जाने के लिए सिफारिश करेंगे ।

class Article 
    def attributes 
    { ... } # define your hash that you want to return at the '...' 
    end 
end 

मेरे लिए यह सीधे to_json के साथ आसपास mucking तुलना में बहुत सरल लगता है।

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