15

मैं कोणीय जेएस की कोशिश कर रहा हूं और मैं अपने रेल अनुप्रयोग में परिभाषित घोंसला संसाधन से डेटा प्राप्त करना चाहता हूं।घोंसला संसाधनों के साथ कोणीय जेएस एनजी रिसोर्स

मैं निम्नलिखित लाइनों ने लिखा है:

UserMission = $resource("https://stackoverflow.com/users/:user_id/user_missions/:id", {user_id: "@user_id", id: "@id"}, {update: {method: "PUT"}}) 
$scope.user_missions = UserMission.query() 

और मैं निम्नलिखित त्रुटि मिलती है:

Processing by UsersController#show as JSON 
    Parameters: {"id"=>"user_missions"} 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", "user_missions"]] 
Completed 404 Not Found in 10ms 

ActiveRecord::RecordNotFound (Couldn't find User with id=user_missions): 
    app/controllers/users_controller.rb:100:in `current_resource' 
    app/controllers/application_controller.rb:34:in `authorize' 

मेरे रेल मार्गों तो जैसे आयोजन किया जाता है:

resources :users do 
    resources :user_missions 
end 

मैं इसे आता है लगता है मुझे "@id" समझ में नहीं आता है। यह कहता है कि यह angularjs site से "डेटा ऑब्जेक्ट" से आता है और मुझे बिल्कुल यकीन नहीं है कि इसका क्या अर्थ है।

किसी भी मदद की सराहना की जाएगी धन्यवाद।

अद्यतन

एक और सवाल। मुझे $resource के साथ नेस्टेड संसाधनों (एक उदाहरण उपयोगकर्ता has_many :missions, through: :user_missions) का उपयोग करके कोणीय के साथ रेल के किसी भी उदाहरण नहीं मिला है। क्या AJAX के साथ नेस्टेड संसाधनों ($resource के साथ) एंजुलरज का एक अच्छा उदाहरण है?

उत्तर

16

अपने पिछले प्रश्न पर मेरे answer के माध्यम से पढ़ें, आपको कॉल में पैरामीटर के रूप में पास किए गए ऑब्जेक्ट में दोनों पैरामीटर के मानों को शामिल करना चाहिए, i। ई .:

$scope.user_missions = UserMission.query({user_id: some_value, id: some_other_value}); 
+1

तो मैं अभी भी थोड़ा उलझन में हूं। मैं मूल ऑब्जेक्ट (उपयोगकर्ता) और बच्चे ऑब्जेक्ट (UserMission) से आईडी कैसे प्राप्त करूं और उन्हें Angularjs के साथ रेल ऐप में संसाधन में भेजूं और एक नेस्टेड रिलेशनशिप क्वेरी पूरी करूँ? – GTDev

+2

अपनी सेवा डिफ़ॉल्ट मानकों को घोषित करके '{user_id:" @user_id ", id:" @id "} 'आप कह रहे हैं कि, जब कोई पैरामीटर वाले सेवा को कॉल करते हैं, तो उन्हें कॉल में आपके द्वारा पारित ऑब्जेक्ट से मूल्य प्राप्त होते हैं। आपके मामले में आप सेवा को 'UserMission.query()' के रूप में किसी भी पैरामीटर के साथ कॉल कर रहे हैं, लेकिन आप कोई मान नहीं दे रहे हैं, इसलिए सेवा को शून्य मानों के साथ बुलाया जाता है, इसलिए सर्वर को '/ उपयोगकर्ता/user_missions 'जो त्रुटि देता है। आपको कॉल में पैरामीटर मान शामिल करना चाहिए, जैसा कि मैंने अपने उत्तर में इंगित किया था। – remigio

10

मैं भी एक तरह से ngResource साथ नेस्ट संसाधनों को संभालने के लिए के लिए देख रहा था। मैं से परिचित कैसे काम करता है रेल या क्या आपके डेटा की तरह दिखता है नहीं कर रहा हूँ, लेकिन यह है कि मैं क्या था:

{"num_results": 5, "objects": [....], "page": 1, "total_pages": 1} 

मैं में पहुंच सकते हैं और क्वेरी कार्रवाई के लिए नेस्टेड वस्तुओं सरणी हड़पने के लिए की जरूरत है। कोणीय के 1.0 संस्करण का उपयोग करना संभव नहीं है। हालांकि, 1.1 संस्करण (मैंने 1.1.3 के साथ परीक्षण किया) के साथ ऐसा करना संभव है।

मेरी नियंत्रक मैं सिर्फ इस तरह संसाधन सेटअप में:

$scope.MyModel = $resource("/api/mymodel/:id", 
    {}, 
    {'query': {method: 'GET', isArray: true, "transformResponse": function (data) { 
     return JSON.parse(data).objects; 
    }}}); 

कुंजी यहाँ transformResponse समारोह कार्रवाई config के हिस्से के रूप पारित कर दिया है। 1.1 में कार्रवाई कॉन्फ़िगरेशन में कोई भी अतिरिक्त कॉन्फ़िगरेशन आइटम अनुरोध के लिए $http कॉन्फ़िगरेशन में पारित किया गया है। $http सेवा transformResponse फ़ंक्शन की अनुमति देती है जो अनुरोध द्वारा लौटाए गए डेटा में हेरफेर कर सकती है। इस फ़ंक्शन का उपयोग करके मैं नेस्टेड स्ट्रक्चर में पहुंच सकता हूं और एक्शन को वापस करने के लिए आवश्यक सरणी वापस कर सकता हूं।

यहां नोटिस करने के लिए एक चेतावनी यह है कि ट्रांसफॉर्म रेस्पॉन्स फ़ंक्शन एक स्ट्रिंग मान प्राप्त करता है, इसलिए आपको पहले जो डेटा की उम्मीद है उसमें डेटा को पार्स करना होगा। दूसरी चेतावनी यह है कि आप वास्तविक अंतिम डेटा मान को वापस लौटते हैं, स्ट्रिंग नहीं। भले ही आपको एक स्ट्रिंग मान प्राप्त होता है, आपको आवश्यक अंत डेटा मान वापस करना चाहिए।

+0

ट्रांसफॉर्मेशन के इस स्पष्टीकरण के लिए धन्यवाद! मुझे इसकी ही खोज थी। – Casey

+1

+1 'ट्रांसफॉर्मेशन' का अच्छा उदाहरण है। –

+1

यदि आप अपने नियंत्रक में 'num_results',' total_pages' आदि प्राप्त करना चाहते हैं तो आप अपने संसाधन में 'क्वेरी: {विधि:' GET ', isArray: false}' का उपयोग कर सकते हैं और फिर 'MyModel.query ({/ * पैरा * *}, फ़ंक्शन (डेटा) {$ scope.numResults = data.num_results; $ scope.things = data.objects;}); ' –

3

"डेटा ऑब्जेक्ट" अपने instance वस्तुओं को संदर्भित करता है ($ scope.user_missions उन वस्तुओं की एक सरणी है - या, बल्कि हो सकता है अगर आप वास्तव में सफलतापूर्वक इसे पुनः प्राप्त करने में कामयाब रहे), और आप के रूप में UserMission के बारे में सोच सकते हैं class

आप class वस्तु (UserMission) पर क्वेरी विधि कॉल करते हैं, तो आपके मामले में, यह क्रम में पता करने की जो उपयोगकर्ता की UserMission (रों) प्राप्त करने के लिए कम से कम एक पैरामीटर की आवश्यकता है।

UserMission.query({user_id: <USER_ID>}); 

के ऊपर एक "प्राप्त सभी"

प्राप्त करने के लिए एक विशिष्ट UserMission ("एक प्राप्त"), आप दोनों आईडी की आपूर्ति करने के लिए होगा प्रदर्शन करेंगे

UserMission.query({user_id: <USER_ID>, id: <MISSION_ID>}); 

समझ में आता है?

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

  • कोई संबंधित समस्या नहीं^_^