【问题标题】:How do I send POST in place of PUT or DELETE in Ember?如何在 Ember 中发送 POST 代替 PUT 或 DELETE?
【发布时间】:2013-09-17 14:06:58
【问题描述】:

如何使用 Ember RESTAdapter 使用 POST 动词更新或删除记录?默认情况下,它使用 PUT 或 DELETE 动词发送 json。在我工作的地方阻止使用这些动词发送。

我有点希望我可以做 Rails 的事情,你发送一个 POST 并使用额外的元信息告诉它是秘密 PUT 还是 DELETE。

我正在通过 RESTAdapter 使用 Ember 1.0.0 和 ember-data 1.0.0beta2。

【问题讨论】:

    标签: javascript json ember.js ember-data


    【解决方案1】:

    我认为覆盖 DS.RESTAdapter updateRecorddeleteRecord 可以工作:

    DS.RESTAdapter.reopen({
      updateRecord: function(store, type, record) {
        var data = {};
        var serializer = store.serializerFor(type.typeKey);
    
        serializer.serializeIntoHash(data, type, record);
    
        var id = Ember.get(record, 'id');
    
        return this.ajax(this.buildURL(type.typeKey, id), "POST", { data: data });
      },
      deleteRecord: function(store, type, record) {
        var id = Ember.get(record, 'id');
    
        return this.ajax(this.buildURL(type.typeKey, id), "POST");
      }
    });
    

    【讨论】:

    • 非常感谢!尽管您的回答使我走上了正确的道路,但最终我不得不重写 Embers ajax 包装器(代码示例中的 this.ajax() )而不是 updateRecord() 或 deleteRecord() 以便我可以添加表单属性 {_method='PUT'}" 具有 Rails 可以接受的内容类型。但我没有明确指定答案必须是 Rails 友好的,所以接受的答案交给你先生!
    • 不客气。 Rails 使用 _method="PUT",因为浏览器中的表单不支持 PUT。在 ajax 调用中一切都会起作用。
    【解决方案2】:

    您可以覆盖 RESTAdapter 上的 ajaxOptions:

    DS.RESTAdapter.reopen({
        ajaxOptions: function(url, type, hash) {
            hash = hash || {};
    
            if (type === 'PUT' || type === 'DELETE') {
                hash.data = hash.data || {};
                hash.data['_method'] = type;
                type = 'POST';
            }
    
            return this._super(url, type, hash);
        }
    });
    

    【讨论】:

      【解决方案3】:

      这是 Ember 2.7.3Ember Data 2.7.0

      的语法
      export default DS.RESTAdapter.extend({
        updateRecord: function(store, type, snapshot) {
          let id = snapshot.id;
          let data = this.serialize(snapshot, { includeId: true });
          const urlForQueryRecord = this.buildURL(type.modelName, id, snapshot, 'updateRecord');
      
          return this.ajax(urlForQueryRecord, 'POST', { data: data });
        }
      })
      

      请注意type.typeKey更改为type.modelName

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2014-03-14
        相关资源
        最近更新 更多