объект вложенного атрибута создается три раза вместо одного - PullRequest
0 голосов
/ 17 октября 2010

У меня три модели, бронирование, номер и путешественники.

В бронировании много номеров в номере много путешественников

Так как я делаю многошаговое бронирование мастера, а номера создаются первыми, путешественники создаются позже в действии обновления.

Это журнал действия обновления: http://pastie.org/private/it7onlg8bnurqkgv6mptrq

А вот соответствующие методы и действия для создания путешественников:

Действие просмотра

def step3
  @booking = Booking.find_by_random_url_key(params[:id])
  @variant = @booking.variant
  @booking.rooms.collect {|room| room.number_of_persons.times {room.travellers.build}  if room.travellers.blank?}
  render :partial => "bookings/partials/step3", :layout => "booking"
end

room.number_of_persons метод просто возвращает int.

Соответствующая часть действия по обновлению

..
elsif @booking.update_attributes(params[:booking]) && @booking.aasm_state == "step3"
  redirect_to booking_step4_url(@booking)
  @booking.next!
..

следующий! это просто переход аазм

Если я создаю в консоли

Room.last.travellers.create(:forename => "john", :country_name => "Germany")

Создается только один объект, и даже если я вернусь в представлении и снова отправлю его, он корректно обновляет созданный объект и не создает новые.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2010

Я заставил это работать, выполняя создание в модели вместо того, чтобы делать это через формы. В общем, после создания комнат я делаю:

self.rooms.map {|r| r.number_of_persons.times {r.travellers.create}}
0 голосов
/ 17 октября 2010
@booking.rooms.collect {|room| room.number_of_persons.times {room.travellers.build}  if room.travellers.blank?}

Это выглядит неправильно для меня. Вы инициируете путешественников, но не храните их и не собираете массив, но ничего не делаете с ним. Кроме того, я понимаю, что вы хотите создать количество путешественников, но при условии, что они не заполнены.

@travellers = @booking.rooms.collect { |room| room.number_of_persons.times { room.travellers.build } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...