2012-03-14 11 views
12

मैं निम्नलिखित एंबर-डाटा मॉडल है कहो मानक स्टोर/एडाप्टर के साथ एम्बर-डेटा के नक्शे।एंबर-डेटा के साथ गैर CRUD कार्यों

हालांकि, मान लें कि किसी व्यक्ति को "स्टार" या "अनस्टार" करने के लिए, एपीआई हमें मानक अपडेट एक्शन द्वारा ऐसा करने नहीं देती है। इस कार्रवाई के लिए एक विशिष्ट API endpoint है:

POST /people/id/star - mark a person as "starred" 
POST /people/id/unstar - mark a person as "unstarred" 

मैं कैसे एंबर डाटा के साथ में इस एपीआई फिट करते हैं?

ऐसा लगता है कि मुझे किसी भी तरह से DS.Store और DS.RESTAdapter को विस्तारित करने की आवश्यकता होगी, लेकिन मुझे इन विभिन्न कार्यों के बारे में जागरूक करने के लिए सबसे अच्छा तरीका सुनिश्चित नहीं है। यह भी गलत लगता है कि ऐप के लिए एक सामान्य एडाप्टर को अभिनीत लोगों के बारे में पता होना चाहिए।

ध्यान दें कि मेरे पास एपीआई पर कोई नियंत्रण नहीं है, इसलिए मैं POST /people/id "अभिनीत" के बारे में जागरूक नहीं कर सकता ताकि यह एक मानक अद्यतन के साथ फिट हो सके।

+0

आप मेरा उत्तर को स्वीकार कर सकता है? वर्तमान में स्वीकृत एक अब सटीक नहीं है – andorov

उत्तर

-1

चर्चा समूह में, Yehuda उल्लेख किया यह अभी तक संभव नहीं है।

+0

चीयर्स, मैंने सोचा कि ऐसा मामला हो सकता है क्योंकि स्रोत/परीक्षण में कुछ भी नहीं निकलता है। – rlivsey

+0

यह अब संभव है - नीचे मेरा उत्तर देखें – andorov

0

हो सकता है कि एक अच्छी शुरुआत: https://github.com/beautifulnode/ember.request

अभी तक यह tryed नहीं था, लेकिन आपके मामले में होनहार है ...

+0

धन्यवाद, दृढ़ता के लिए कुछ विकल्प हैं लेकिन मैं वर्तमान में एम्बर डेटा को एक शॉट दे रहा हूं क्योंकि मुझे उम्मीद है कि भविष्य में यह डिफ़ॉल्ट होगा। – rlivsey

+0

@rlivsey आपको अंततः एम्बर-डेटा के साथ गैर-क्रूड क्रियाओं का उपयोग करने के लिए एक काम मिल गया और यहां आपके समाधान को वापस पोस्ट करने के लिए दिमाग कर रहा था। धन्यवाद – brg

+0

@ माइक मैंने मिनट के लिए स्रोत कोड को देखा, जिसमें गैर-क्रूड एक्शन और रूट # टैग का समर्थन करता है और आपके ** [Apps.TagView] में (https://github.com/mikecrittenden/minutefavors/blob/master /app/assets/javascripts/app/views/favors/tag.js)** आपने एक यूआरएल फ़ंक्शन परिभाषित किया है जो '/ favor/tag' देता है। मुझे पता है कि आपने उस ऐप के लिए एम्बर-संसाधन का उपयोग किया है, हम एम्बर-डेटा आराम एडाप्टर के साथ कुछ कैसे कर सकते हैं। धन्यवाद, – brg

0

मुझे लगता है कि CQRS थर्म स्टार और अनस्टार कमांड हैं। तो आपको मॉडल पर्सस्टार घोषित करना चाहिए और इसके साथ काम करना चाहिए।

2

मैं एक ही मुद्दे के माध्यम से चला गया, और क्या यहाँ से समझाया गया है का एक संशोधित संस्करण का उपयोग कर इसे हल: Non-crud rails actions in Ember.js

मूल रूप से, आप एक jQuery AJAX कॉल उपयोग करने की आवश्यकता, मेरे लिए महत्वपूर्ण हिस्सा बदलने के लिए था फॉर्म-डेटा (डिफ़ॉल्ट, यदि आप अपनी कॉल में डेटा शामिल करते हैं) के बजाय अनुरोध शीर्षलेख में ऑथ डेटा भेजने के लिए सामग्री टाइप करें।इसके अलावा, अन्यथा 'इस' 'सफलता' कॉलबैक में काम नहीं करेगा, AJAX के भाग में उचित संदर्भ देना सुनिश्चित करें:

App.ItemController = Ember.ObjectController.extend 
    actions: 
     starItem: -> 
      controller = this 
      item = @get 'model' 
      id = item.id 
      token = @auth.get 'authToken' 
      $.ajax 
       type: 'PUT' 
       context: controller 
       data: '{ "auth_token": "' + token + '"}' 
       url: '/api/v1/items/' + id + '/star' 
       contentType: 'application/json; charset=UTF-8' 
       dataType: 'json' 
       success: -> 
        if @get 'item.starred_by_user' 
         @set 'model.starred_by_user', false 
         item.decrementProperty('total_stars') 
        else 
         @set 'model.starred_by_user', true 
         item.incrementProperty('total_stars') 
10

थोड़ी देर गया है और यह समय में संभव नहीं हो सकता है,

YourApp.Store.prototype.adapter.ajax(url, action, {data: hashOfParams}) 

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

YourApp.Store.prototype.adapter.ajax('/products', 'GET', {data: {ids: [1,2,3]}}) 

अपने प्रश्न के लिए:

लेकिन आप अपने एडाप्टर के ajax विधि सीधे कॉल कर सकते हैं
YourApp.Store.prototype.adapter.ajax('/people' + id + '/star','POST') 

संपादित - buildURL का उपयोग कर उपयोगी है, तो आप अपने एडाप्टर पर एक नाम स्थान निर्धारित किया है, खासकर यदि:

url = YourApp.Store.prototype.adapter.buildURL('people',id) + '/star' 

संपादित 2 - तुम भी container.lookup('adapter:application') साथ एडाप्टर, जो उपयोगी है प्राप्त कर सकते हैं आप अनुप्रयोग (पूर्व ES6 मॉड्यूल/एंबर-CLI)

संपादित 3 करने के लिए वैश्विक पहुँच नहीं है, तो - ऊपर एंबर/एंबर-CLI के एक पुराने संस्करण को दर्शाता है। अब मैं एक mixin में इस समारोह को परिभाषित -

customAjax: (method, type, id, action, hash = null) -> 
    #note that you can now also get the adapter from the store - 
    #adapter = @store.adapterFor('application') 
    adapter = @container.lookup('adapter:application') 
    url = adapter.buildURL(type, id) + '/' + action 
    hash['data'] = $.extend({}, hash) if hash #because rails 
    adapter.ajax(url, method, hash).then (result) => 
     return result 

और यह इतनी तरह कहते हैं -

@customAjax('PUT', 'modelClass', modelId, 'nonCRUDActionName', optionalHashOfAdditionalData).then (response) => 
    #do something with response 
संबंधित मुद्दे