Недопустимый параметр в вложенных атрибутах Rails API

Я пытаюсь обновить объект с помощью вложенных полей и получаю Unpermitted parameters ошибка. Поле, которое вызывает ошибку, само по себе является отношением к другой таблице во вложенной таблице. Ниже приведены особенности:

Докторский класс

class Doctor < User
    has_many :professional_licenses, dependent: :destroy
    has_many :states, through: :professional_licenses
    accepts_nested_attributes_for :professional_licenses, allow_destroy: true
   ...
end

Профессиональная лицензия

class ProfessionalLicense < ApplicationRecord
  belongs_to :doctor
  belongs_to :state

  validates_presence_of :code
end

Государственный класс

class State < ActiveRecord::Base
  validates_presence_of :iso_abbr, :name
end

Доктор контроллер

...
def update
  doctor = @current_user
  params[:doctor][:professional_licenses_attributes].each do |license, index|
    license[:state] = State.find_by_iso_abbr license[:state]
  end
  doctor.update_attributes(doctor_params)
  render json: doctor, status: :ok
end
...
def doctor_params
  params.require(:doctor).permit(:email, :first_name, :last_name, :password, 
  :password_confirmation, professional_licenses_attributes: [:code, :state, :_destroy])
end

Вызов из интерфейса выглядит следующим образом:

{
"doctor":{
    "first_name":"Doctor Postman",
    "professional_licenses_attributes": [
        {
            "code": "NY-1234",
            "state": "NY"
        },
        {
            "code": "MA-1234",
            "state": "MA"
        }
    ]
}
}

Когда я отправляю вызов, запись обновляется и создаются лицензии. Однако лицензии создаются без состояния, потому что контроллер говорит Unpermitted parameters: state, Я пробовал разные подходы, но не могу найти способ разрешить государству. Пожалуйста помоги!

1 ответ

Решение

В вашем случае code Параметр, как ожидается, будет простым значением, таким как целое число или строка. Но вы конвертируете его в объект, атрибуты которого также необходимо добавить в список разрешенных.

Попробуй пройти code_id (целое число) вместо code (Объект):

...
def update
  doctor = @current_user
  params[:doctor][:professional_licenses_attributes].each do |license|
    state = State.find_by_iso_abbr(license.delete(:state))
    license[:state_id] = state.id if state
  end
  doctor.update_attributes(doctor_params)
  render json: doctor, status: :ok
end
...
def doctor_params
  params.require(:doctor).permit(:email, :first_name, :last_name, :password, 
  :password_confirmation, professional_licenses_attributes: [:code, :state_id, :_destroy])
end
Другие вопросы по тегам