导轨5阿比从嵌套的资源JSON创建新对象(Rails 5 Api create new object

2019-09-28 06:46发布

这是接收作为来自外部角的web应用的参数JSON:

{
  "provincia": {
    "id": 1,
    "name": "Province"
  },
  "username": "tester",
  "direccion": "new avenue 100",
  "email": "nomail@mail.com"
}

这是我的控制器

 def create
   @seller = Seller.new(seller_params)

  if @seller.save
    render json: @seller, status: :created, location: @seller
  else
    puts @seller.errors.full_messages
    render json: @seller.errors, status: :unprocessable_entity
  end
end

这是seller_params

def seller_params
    params.require(:seller).permit(:username, :direccion, :email, :provincia_id)
end

型号:卖家belongs_to的省报

服务器控制台输出错误完整的邮件

Provincia must exist

其中修改了Rails API中我应该做的,使其工作,并保存新的卖家? 提前致谢。

Answer 1:

您permiting您的PARAMS控制器的方式是不正确的:

Rails的文档

你需要通过你的provincia_id在你的属性或允许要传递到控制器的属性

方法1:

{
  "provincia_attributes": {
    "id": 1,
    "name": "Province"
  },
  "username": "tester",
  "direccion": "new avenue 100",
  "email": "nomail@mail.com"
}

SellersController.rb

def seller_params
  params.require(:seller).permit(:username, :direccion, :email, provincia_attributes: [:id, :name])
end

2路

{
  "provincia_id": "1"
  "username": "tester",
  "direccion": "new avenue 100",
  "email": "nomail@mail.com"
}

SellersController.rb

def seller_params
  params.require(:seller).permit(:username, :direccion, :email, :provincia_id)
end


Answer 2:

尝试改变这样的PARAMS:

def seller_params
  p = params.require(:seller).premit(:username, :direccion, :email).to_h
  p[:seller][:provincia_id] = params[:seller][:provincia][:id]
  p
end

这将添加缺少的协会“provincia_id”键。 我打电话to_h得到一个新的哈希值,因为我不喜欢变异原PARAMS和你已经permited您想要的值,使散列使用安全。



文章来源: Rails 5 Api create new object from json with nested resource