ember.js 在Ember中创建新记录时出现Rails ActionController::ParameterMissing错误

ql3eal8s  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(151)

Rails 5.2,带有快速jsonapi 1.5和Ember 3.4
我在Ember中创建了一个新的标记记录,如下所示:

let newTag = this.get('store').createRecord('tag', {
  name: this.get('name')
});
newTag.save();

这将发送以下json(如Chrome的Network选项卡中所示的Request Payload):

{"data":{"attributes":{"name":"photos","created_at":null,"updated_at":null},"type":"tags"}}

但是Rails只得到(通过输出TagsController的create方法中的参数来验证):

{"controller"=>"tags", "action"=>"create"}

并抛出以下错误:

ActionController::ParameterMissing (param is missing or the value is empty: tag)

下面是我的控制器代码:


# app/controllers/tags_controller.rb

class TagsController < ApplicationController
  def create
    tag = Tag.create!(tag_params)
    render json: {status: "success"}
  end

  private

  def tag_params
    puts params
    params.require(:tag).permit(:name)
  end
end

让ember和rails相互理解的诀窍是什么?既然ember在有效负载中发送“type”,我能否让Rails理解这是模型,从而满足我设置的“tag”出现在params中的要求?

envsm3lx

envsm3lx1#

在重新阅读了action controller概述之后,我了解到我必须在请求中包含'Content-Type': 'application/json'头。

// app/adapters/application.js

import DS from 'ember-data';

export default DS.JSONAPIAdapter.extend({
  init() {
    this._super(...arguments);
    this.set('headers', {
      'Content-Type': 'application/json'
    });
  }
});

我必须处理的下一个问题是改变Rails控制器中强参数的使用:


# app/controllers/tags_controller.rb

def tag_params
  params.require(:data).require(:attributes).permit(:name)
end

希望这对其他人有帮助。

nzk0hqpo

nzk0hqpo2#

在ember 3.26中,你可以这样做:

export default class ApplicationAdapter extends JSONAPIAdapter {
headers = {
  'Content-Type': 'application/json'
}

而不是

export default DS.JSONAPIAdapter.extend({
init() {
this._super(...arguments);
this.set('headers', {
  'Content-Type': 'application/json'
});

相关问题