0

時間間隔の仮想属性を持つモデルがあります。

attr_accessible :description, :time_end, :time_start, :duration
belongs_to :timesheet

def duration
  if attribute_present?("time_start") and attribute_present?("time_end")
    ChronicDuration.output(self.time_end - self.time_start) 
  else
    ChronicDuration.output(0)
  end
end

def duration=(d)
  self.time_end = self.time_start + d
end

ただし、新しいオブジェクトを作成する場合、Rails は開始前に期間を設定しようとするため、エラーが発生します。開始後に期間が設定されていることを確認するにはどうすればよいですか?

エラー:

undefined method `+' for nil:NilClass

パラメータ:

{"utf8"=>"✓",
 "authenticity_token"=>"dg+CysIxZORyV3cwvD+LdWckFdHgecGDFDBNOip+iKo=",
 "entry"=>{"time_start"=>"now",
 "duration"=>"2h",
 "description"=>""},
 "commit"=>"Create Entry"}
4

2 に答える 2

1

end1.)それはキーワードであり、問​​題を引き起こす可能性があるため、属性に名前を付けるのは賢明ではありません。

2.)パラメータハッシュを投稿してください

于 2012-06-24T09:41:44.127 に答える
1

いくつかのこと

  • 読む価値のあるもの: andvs &&in ruby​​ - http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/
  • attribute_present の使用に代わるものはありますか? 方法

    # opposite of blank? - http://api.rubyonrails.org/classes/Object.html#method-i-present-3F
    if time_start.present? && time_end.present?
    
    # short hand syntax for present?
    if time_start? && time_end?
    

time_start が datetime または time データベース タイプであると仮定すると、Rails コンソールでこれを試してください。

entry = Entry.new
entry.time_start = "now" 
# => "now"
entry.time_start
# => nil

文字列を時間オブジェクトとレールに渡しています/ルビーは値をnilに設定するだけです。time_end と time_start が文字列だったとしても、あなたのコードがあなたの望む結果をもたらすとは思えませんか?

def duration=(d)
  self.time_end = self.time_start + d
end

# params: time_start = "now"
# params: duration = "2h"
# time_end would be: now2h

time_start が設定される前に実行されている duration= について間違っている場合、代替手段は before_save コールバックを使用してこのようなものになります

class Entry < ActiveRecord::Base
  before_save :set_time_end

  attr_accessor :duration
  attr_accessible :description, :time_end, :time_start, :duration

  belongs_to :timesheet

  def duration
    if time_start? && time_end?
      ChronicDuration.output(self.time_end - self.time_start) 
    else
      ChronicDuration.output(0)
    end
  end

  def set_time_end
    return nil if time_start.blank?
    self.time_end = self.time_start + self.duration
  end
end
于 2012-06-24T18:33:18.213 に答える