因此在我看来,我正在使用日历来选择日期和下拉以选择时间。因此我使用before_validation
方法将它组合在一起:
proposed_time.rb
before_validation :construct_starting_at
def construct_starting_at
d = Time.parse(date)
puts "************** construct_starting_at BEGIN *****************"
puts "DATE: #{d}"
puts "Time: #{time}"
puts "Timezone: #{timezone}"
puts "construct_starting_at :: #{d.year}-#{d.month}-#{d.day} #{time.hour}:#{time.min}:00 #{timezone}"
if date.present? && time.present? && timezone.present?
starting_at = Time.zone.parse("#{d.year}-#{d.month}-#{d.day} #{time.hour}:#{time.min}:00 #{timezone}")
end
puts "starting_at: #{starting_at}"
puts "************** construct_starting_at END *****************"
end
当我创建一个对象时,它工作得很好,但是在我更新它时却没有。
登录
************** construct_starting_at BEGIN *****************
DATE: Fri Jun 03 00:00:00 -0500 2011
Time: Thu May 19 23:00:00 UTC 2011
Timezone: (GMT-05:00) Eastern Time (US & Canada)
construct_starting_at :: 2011-6-3 23:0:00 (GMT-05:00) Eastern Time (US & Canada)
starting_at: 2011-06-04 00:00:00 -0400
************** construct_starting_at END *****************
但是当我使用它进行更新时,它会完全失去它并恢复到它的状态。这让我觉得它实际上并没有被保存。因此,为了帮助解释下一个上下文,我有一个ProposedTime
对象,它是Consultation
的孩子(每个咨询有3个提议时间),也有accepts_nested_attributes_for :proposed_times
:
consultation.rb
def proposed_times_attributes=(attributes)
puts "$$$$$$$$$$$$$$ proposed_times_attributes $$$$$$$$$$$$$$$$"
attributes.each do |key,value|
value[:timezone] = timezone
if value[:id]
puts "Updating #{value[:id]}"
p = ProposedTime.find(value[:id])
value.delete(:id)
unless p.update_attributes(value)
puts "@@@@@@@@@@@@@@@@@ ERROR @@@@@@@@@@@@@@@"
error.add(:proposed_times, "something is wrong")
end
puts "-- starting_at: #{p.starting_at}"
else
puts "Creating a new proposed time"
proposed_times << ProposedTime.new(value)
end
end
puts "$$$$$$$$$$$$$$ proposed_times_attributes $$$$$$$$$$$$$$$$"
end
登录
...
Updating 18
************** construct_starting_at BEGIN *****************
DATE: Fri Jun 03 00:00:00 -0500 2011
Time: Thu May 19 23:00:00 UTC 2011
Timezone: (GMT-05:00) Eastern Time (US & Canada)
construct_starting_at :: 2011-6-3 23:0:00 (GMT-05:00) Eastern Time (US & Canada)
starting_at: 2011-06-04 00:00:00 -0400
************** construct_starting_at END *****************
-- starting_at: 2011-06-01 06:00:00 -0400
我认为它可能在update_attributes上抛出错误,但它似乎不是。有什么想法吗?
答案 0 :(得分:4)
我还没有完全理解这一点,但我只是想做一些简单的事情 - 我认为你希望starting_at不是一个局部变量,但实际上设置了你的对象的starting_at属性:
self.starting_at = Time.zone.parse("#{d.year}-#{d.month}-#{d.day} #{time.hour}:#{time.min}:00 #{timezone}")
关键位为self.
,以确保设置属性,而不是仅存在于该方法中的同名局部变量。