Rails 5 Api создает новый объект из json с вложенным ресурсом - PullRequest
0 голосов
/ 16 ноября 2018

это 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

это продавец_парамс

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

модели: продавец принадлежит_Провинция

ошибка вывода на серверную консоль сообщения

Provincia must exist

Какую модификацию в Rails API я должен сделать, чтобы она заработала и сохранила нового продавца? заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

То, как вы разрешаете свои параметры в контроллере, неверно:

Rails Docs

Вам необходимо передать ваш 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
0 голосов
/ 16 ноября 2018

Попробуйте изменить параметры следующим образом:

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, чтобы получить новый хеш, потому что я не люблю изменять исходные параметры, и вы уже допустили значения, которые хотите, чтобы Hash был безопасным для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...