Вложенные атрибуты Rails, некоторые из которых уже существуют, вызывают запрос к базе данных

Я пытаюсь сделать что-то, что, как мне кажется, должно быть очень простым. У меня есть четыре модели следующим образом:

class Checkout < ActiveRecord::Base
  has_many :checkedout_items
  belongs_to :student, :autosave => true
  attr_accessible :student_id, :status, :checkedout_items_attributes, :student_attributes, :status
  accepts_nested_attributes_for :checkedout_items
  accepts_nested_attributes_for :student
end

class CheckedoutItem < ActiveRecord::Base
  belongs_to :checkout, :autosave => true
  has_one :item, :foreign_key => "id"
  attr_accessible :enddate, :checkout_id, :item_id, :startdate, :status, :item_attributes
  accepts_nested_attributes_for :item
end

class Item < ActiveRecord::Base
  attr_accessible :name, :category
end

class Student < ActiveRecord::Base
  has_many :checkouts, dependent: :destroy
  attr_accessible :email, :firstname, :lastname, :phonenumber, :uin
end

Я хочу иметь одну форму, в которой конечные пользователи могут создавать как студентов, так и Checkout_items в одной форме. Итак, у меня есть представление, которое создает форму и создает следующую хеш-структуру:

{"utf8"=>"✓",
 "authenticity_token"=>"m6yH1LhtOk/kDqpLDRlNkxFSAA1WmGARywgT4DwYmKo=",
 "checkout"=> {
   "student_attributes"=> {
     "firstname"=>"Jimmy",
     "lastname"=>"Johnson",
     "uin"=>"899006555",
     "email"=>"[email protected]",
     "phonenumber"=>"1234445555"
   },
   "checkedout_items_attributes"=> {
     "0"=> {
       "item_attributes"=> {
         "id"=>"1",
         "name"=>"Camera #1"
       },
       "startdate(2i)"=>"12",
       "startdate(3i)"=>"8",
       "startdate(1i)"=>"2014",
       "startdate(4i)"=>"04",
       "startdate(5i)"=>"00"
     },
     "1"=> {
       "item_attributes"=> {
         "id"=>"2",
         "name"=>"Camera #2"
       },
       "startdate(2i)"=>"12",
       "startdate(3i)"=>"8",
       "startdate(1i)"=>"2014",
       "startdate(4i)"=>"04",
       "startdate(5i)"=>"00"
     }
   }
 },
"commit"=>"Finish"}

Когда эти данные отправляются на мой контроллер, я пытаюсь создать новый объект проверки следующим образом:

@checkout = Checkout.new(params[:checkout])

Однако это вызывает ошибку: «Не удалось найти элемент с идентификатором = 1 для CheckedoutItem с идентификатором =». Я пытался искать другие проблемы, связанные с этим, но я не нашел многого.

Последний ключевой элемент информации заключается в том, что элемент всегда должен существовать до создания проверки, поэтому элементы с идентификаторами 1 и 2 уже существуют в базе данных. Может ли кто-нибудь дать некоторое представление о том, что происходит не так?

РЕДАКТИРОВАТЬ: метод контроллера:

def create
    @checkout = Checkout.new(params[:checkout])

    respond_to do |format|
      if @checkout.save
        format.html { redirect_to @checkout, notice: 'Checkout was successfully created.' }
        format.json { render json: @checkout, status: :created, location: @checkout }
      else
        format.html { render action: "new" }
        format.json { render json: @checkout.errors, status: :unprocessable_entity }
      end
    end
  end

Ошибка:

Couldn't find Item with ID=2 for CheckedoutItem with ID=

Частичная трассировка:

activerecord (3.2.16) lib/active_record/nested_attributes.rb:487:in `raise_nested_attributes_record_not_found'
activerecord (3.2.16) lib/active_record/nested_attributes.rb:357:in `assign_nested_attributes_for_one_to_one_association'
activerecord (3.2.16) lib/active_record/nested_attributes.rb:313:in `item_attributes='
activerecord (3.2.16) lib/active_record/attribute_assignment.rb:94:in `block in assign_attributes'
activerecord (3.2.16) lib/active_record/attribute_assignment.rb:93:in `each'
activerecord (3.2.16) lib/active_record/attribute_assignment.rb:93:in `assign_attributes'
activerecord (3.2.16) lib/active_record/base.rb:498:in `initialize'
activerecord (3.2.16) lib/active_record/reflection.rb:183:in `new'
activerecord (3.2.16) lib/active_record/reflection.rb:183:in `build_association'
activerecord (3.2.16) lib/active_record/associations/association.rb:239:in `build_record'
activerecord (3.2.16) lib/active_record/associations/collection_association.rb:112:in `build'
activerecord (3.2.16) lib/active_record/nested_attributes.rb:430:in `block in assign_nested_attributes_for_collection_association'
activerecord (3.2.16) lib/active_record/nested_attributes.rb:425:in `each'
activerecord (3.2.16) lib/active_record/nested_attributes.rb:425:in `assign_nested_attributes_for_collection_association'
activerecord (3.2.16) lib/active_record/nested_attributes.rb:313:in `checkedout_items_attributes='
activerecord (3.2.16) lib/active_record/attribute_assignment.rb:94:in `block in assign_attributes'
activerecord (3.2.16) lib/active_record/attribute_assignment.rb:93:in `each'
activerecord (3.2.16) lib/active_record/attribute_assignment.rb:93:in `assign_attributes'
activerecord (3.2.16) lib/active_record/base.rb:498:in `initialize'

Версия рельсов: 3.2.16


person James    schedule 08.12.2014    source источник
comment
Можете ли вы опубликовать свой метод контроллера для создания кассы?   -  person Ken Stipek    schedule 08.12.2014
comment
Какую версию рельсов вы используете?   -  person AytanLeibowitz    schedule 08.12.2014
comment
@KenStipek Я обновил OP с этими подробностями.   -  person James    schedule 08.12.2014
comment
Можете ли вы опубликовать всю ошибку?   -  person Ken Stipek    schedule 08.12.2014
comment
@KenStipek В этом была вся ошибка. Я прикрепил частичную трассировку, если это поможет.   -  person James    schedule 08.12.2014
comment
Я не вижу ничего плохого, вы можете показать нам что-нибудь еще?   -  person Ken Stipek    schedule 08.12.2014


Ответы (1)


Если кто-то столкнется с этим в будущем, я смог решить эту проблему, используя методы, описанные в этом сообщении: https://stackoverflow.com/a/12064875/2443892.

person James    schedule 14.12.2014