0

したがって、私の見解では、カレンダーを使用して日を選択し、ドロップダウンを使用して時間を選択しています。したがって、私はbefore_validationそれをまとめる方法を使用しています:

提案された_時間.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

相談.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 でエラーがスローされているのではないかと思いましたが、そうではないようです。何か案は?

4

1 に答える 1

4

私はこれを完全に理解しているわけではありませんが、単純なことだけを考えています - starting_at をローカル変数ではなく、実際にオブジェクトの starting_at 属性を設定したいと思います:

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

重要なビットは、self.そのメソッド内にのみ存在する同じ名前のローカル変数ではなく、実際に属性が設定されていることを確認するためです。

于 2011-05-20T01:05:44.803 に答える