Это мой первый вопрос здесь, так что, надеюсь, он сработает. Я искал кого-то с похожей проблемой, но пока ничего не нашел. Я уверен, что это что-то простое, но я просто не вижу этого прямо сейчас!
Я пытаюсь сохранить вложенные атрибуты для модели в rails 3.2.11, но операция работает только при создании вложенного объекта, но не при его обновлении.
Вот код для двух моделей, с которыми я работаю
class Property < ActiveRecord::Base
has_many :opening_times
accepts_nested_attributes_for :opening_times, :allow_destroy => true
attr_accessible :opening_times_attributes
...
class OpeningTime < ActiveRecord::Base
belongs_to :property
attr_accessible :start_date, :end_date
attr_accessible :day, :start_time, :end_time
attr_writer :day, :start_time, :end_time
before_save :set_dates
...
def set_dates
day = Date.parse(@day)
start_time = Time.parse(@start_time)
end_time = Time.parse(@end_time)
start_date = "#{day.day}/#{day.month}/#{day.year} #{start_time.hour}:#{start_time.min}"
self.start_date = DateTime.parse(start_date)
end_date = "#{day.day}/#{day.month}/#{day.year} #{end_time.hour}:#{end_time.min}"
self.end_date = DateTime.parse(end_date)
end
Поэтому, когда я пытаюсь создать время открытия через свойство с помощью консоли rails, это работает:
1.9.3p125 :006 > p = Property.find(9)
1.9.3p125 :006 > p.opening_times_attributes = [{"day"=>"27/02/2013", "start_time"=>"11:30", "end_time"=>"12:30", "_destroy"=>"false"}]
=> [{"day"=>"27/02/2013", "start_time"=>"11:30", "end_time"=>"12:30", "_destroy"=>"false"}]
1.9.3p125 :007 > p.save!
(0.1ms) begin transaction
Suburb Load (0.2ms) SELECT "suburbs".* FROM "suburbs" WHERE "suburbs"."name" = 'BARREN GROUNDS' LIMIT 1
SQL (0.6ms) INSERT INTO "opening_times" ("end_date", "property_id", "start_date") VALUES (?, ?, ?) [["end_date", Wed, 27 Feb 2013 12:30:00 UTC +00:00], ["property_id", 9], ["start_date", Wed, 27 Feb 2013 11:30:00 UTC +00:00]]
(2.8ms) commit transaction
=> true
Но когда я пытаюсь обновить существующий вложенный объект (передавая идентификатор в хеше), он ничего не делает.
1.9.3p125 :037 > p.opening_times
=> [#<OpeningTime id: 12, property_id: 9, start_date: "2013-02-27 11:00:00", end_date: "2013-02-27 13:00:00">]
1.9.3p125 :038 > p.opening_times_attributes = [{"day"=>"27/02/2013", "start_time"=>"11:30", "end_time"=>"12:30", "_destroy"=>"false", "id"=>12}]
=> [{"day"=>"27/02/2013", "start_time"=>"11:30", "end_time"=>"12:30", "_destroy"=>"false", "id"=>12}]
1.9.3p125 :039 > p.save!
(0.1ms) begin transaction
Suburb Load (0.2ms) SELECT "suburbs".* FROM "suburbs" WHERE "suburbs"."name" = 'BARREN GROUNDS' LIMIT 1
(0.1ms) commit transaction
=> true
1.9.3p125 :040 > exit
Основываясь на том, что я прочитал до сих пор (например, http://archives.ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes), это должно работать для обоих операции.
Любая идея о том, что я делаю неправильно?
Спасибо!
[РЕДАКТИРОВАТЬ]
Основываясь на предложении @jvnill, кажется, что обратный вызов before_save не вызывается при обновлении. Я добавил обходной путь для явного вызова set_dates при обновлении любого из полей, и тогда он работает.
def day=(day)
@day = day
set_dates unless (@day.blank? || @start_time.blank? || @end_time.blank?)
end
def start_time=(start_time)
@start_time = start_time
set_dates unless (@day.blank? || @start_time.blank? || @end_time.blank?)
end
def end_time=(end_time)
@end_time = end_time
set_dates unless (@day.blank? || @start_time.blank? || @end_time.blank?)
end
Это не решает проблему полностью, поскольку теперь проверка не работает гладко, и кажется, что мне приходится вручную выполнять работу, которую должен выполнять AR.
set_dates
. Вы можете проверить этот метод и убедиться, что обновление проходит без проблем? - person jvnill   schedule 18.02.2013