Использовать существующую запись в `accepts_nested_attributes_for` с ассоциацией has_one, передавая id - PullRequest
0 голосов
/ 30 апреля 2020

RoR noob здесь, используя Mongoid.

У меня есть модель (ItineraryItem) с has_one ассоциацией, которая accepts_nested_attributes_for

class ItineraryItem
  include Mongoid::Document
  include Mongoid::Timestamps
  field :title, type: String

  has_one :poi
  accepts_nested_attributes_for :poi
end

Я могу создать новую ItineraryItem путем передачи poi_attributes

Следующее тело параметра работает для создания нового ItineraryItem вместе с Poi:

{
  "itinerary_item" : {
    "title" : "Itinerary Item With New POI",
    "description" : "Itinerary Item Description",
    "poi_attributes" : {
        "title" : "A New POI in creation"
    }
  }
}

Но я не могу создать новый ItineraryItem с существующим Poi

Следующее не работает для меня:

{
  "itinerary_item" : {
    "title" : "Itinerary Item With New POI",
    "description" : "Itinerary Item Description",
    "poi_attributes" : {
        "id" : "5ea9bdf6b980a78222f71263" # I've made sure this id exists
    }
  }
}

Выше выдает ошибку

Poi недопустимо

с 422 (Unprocessable Entity)

Я предполагаю, что я не должен связывать существующую запись POI, так как это однозначное сопоставление, и каждый ItineraryItem должен иметь свой собственный Poi. Но я не уверен. Это заблокировано Rails, или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

В контроллере internary_items добавьте id к вложенным атрибутам. В вашем случае это будет:

params.require(:payload).permit(:iternary_item, :poi_attributes => [:id, :x,:y])
0 голосов
/ 30 апреля 2020

Если Poi имеет пустое поле iternary_item_id, его можно «переназначить» другому объекту.

Из того, что вы опубликовали, похоже, что вы пытаетесь создать новый объект через своего рода контроллер API. Попробуйте запустить rails c onsole и проверьте, можете ли вы создать новый IternaryItem с идентификатором банка в качестве вложенного параметра - он может дать вам некоторые подробные ошибки - если вы можете это сделать, то проблема заключается где-то еще, например, вам нужно добавить id в список разрешенных параметров poi_attributes в контроллере

...