尝试在before_validation中设置变量,但它不起作用

因此,在我看来,我使用日历来选择日期和下拉以选择时间。 因此我使用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上抛出一个错误,但它似乎不是。 有任何想法吗?

我没有充分理解这一点,但我只是想做一些简单的事情 – 我认为你想要starting_at不是一个局部变量,但实际上设置了你的对象的starting_at属性:

 self.starting_at = Time.zone.parse("#{d.year}-#{d.month}-#{d.day} #{time.hour}:#{time.min}:00 #{timezone}") 

关键是self. ,实际确保设置属性,而不是只存在于该方法中的同名局部变量。