2012-03-31 10 views
1

EDIT:以下の質問は少し「広範囲」に見える場合は、要約は、私は目的のために純粋に私のモデルでは、日付フィールドおよびオプションの時間フィールドを結合したいということです日付バリデータを使用して検証するのですが、文字列を渡すときにテストが正しく失敗することはありません。検証の日付と時刻のフィールドが


EDIT 2:私はまだ、私はちょうど時間値が時間の目的であったことを確認することができれば、私は疑問に思った検証を目的とした時間オブジェクトと日付オブジェクトを結合する方法を見つけるのに苦労していますので、 (むしろ、無効な文字列よりも)is_a?(Time)を使用しますが、それはどちらか動作していないようでしたし、それが原因でTime mention with this methodであった場合、私は疑問に思った(しかし、私は非常に十分なことが問題の原因かどうかを知るためにそれを理解していない。

また、to_time methodが、何かがTimeオブジェクトであるかどうかを確認するのに役立つかもしれないかどうか疑問に思っていますが、わかりません。

DateオブジェクトをTimeオブジェクトに参加させて検証を行う方法をアドバイスしてください。少なくとも、送信される時刻の値がTimeオブジェクトで、無効な文字列ではないことを確認する方法を教えてください。 。


EDIT 3:私はちょうど私が見つけた他の回答に基づいて、以下を試してみたが、それはまだテスト中で「無効」の文字列文句はありません:

validate :start_time_is_time?, :if => "start_time.present?" 

def start_time_is_time? 
    unless start_time.is_a?(Time) || ((Time.parse(start_time) rescue ArgumentError) == ArgumentError) 
    errors.add(:start_time, 'must be a valid time') 
    end 
end 

があります文字列が有効なTimeと考えられる理由は何ですか?


は、私は時間を選択するために、1日、ドロップダウンを選択し、カレンダーを使用するビューとTrying to set a variable in before_validation but it isn't workingと同様の図を持っています。私は同じモデルを私のモデルに適用しようとしましたが、私は少しルビーに慣れていて、答えによって残された空白を埋めるのに問題がありましたので、動作させることができませんでした。

私のモデルは、START_DATEとstart_timeのフィールドがあります。

これらの2つのフィールドを組み合わせるだけで、日付と時刻を別々に検証するのではなく、datetime(date_validator gemを使用して)を一緒に検証することができます。誰かが私をそうでなければ説得することができない限り(私は彼らと別々にたくさん行っているが、実際にはこれを変えたくない)。

日付は提出する必要がありますが、時間のフィールドはオプションです。私はその後、date_validatorの宝石を使用して検証することができ、仮想フィールドに必要に応じて2つのフィールドを組み合わせることができますbefore_validation方法を必要とするように見える他の質問から

EDIT:元のエラーはRyanJMのおかげで修正されましたが、私はまだテストが正常に合格することができません。以下は現在のプレーの状態です。

がここに今、私のショータイムモデルの基礎です:

class Showtime < ActiveRecord::Base 

    attr_accessible :start_date, :start_time 

    attr_accessor :starting_at, :starting_time 

    belongs_to :performance 

    before_validation :construct_starting_at 

    validates :start_date, :presence => true, :date => { :after_or_equal_to => Proc.new { Date.today } } 
    validates :starting_at, :date => { :after_or_equal_to => Proc.new { Time.now } }, :if => "start_date.present? && start_time.present?" 

    def construct_starting_at 
    if start_date.present? && start_time.present? 
     self.starting_time = self.start_time.strftime("%T") 
     self.starting_at = DateTime.strptime("#{start_date} #{starting_time}", "%F %T") 
    end 
    end 

end 

、それを必要とする場合は、ここでのパフォーマンスモデルの基礎/関連部品です:

class Performance < ActiveRecord::Base 

    has_many :showtimes, :dependent => :delete_all 
    accepts_nested_attributes_for :showtimes, :allow_destroy => true, :reject_if => lambda { |a| a[:start_date].blank? } 

end 

ここで失敗するテストがあります:

require 'spec_helper' 

describe Showtime do 

    before(:each) do 
    @attr = { 
     :name => "Performance 1", 
     :showtimes_attributes => { 
       "0" => { 
        :start_date => Date.today+15.days, 
        :start_time => Time.now 
       } 
     } 
    } 
    end 

    it "should test that the start time is a valid time if it exists" do 
    @attr_invalid = { 
     "0" => { 
      :start_date => Date.today+15.days, 
      :start_time => "invalid" 
     } 
    } 
    invalid = Performance.create(@attr.merge(:showtimes_attributes => @attr_invalid)) 
    invalid.should_not be_valid 
    end 

end 

うまくいけば、上記のコードで、私はちょうどセサリーパーツ。

+0

それのstart_timeが実際にデータベースに定義されてどのように? start_dateはデータベースのdatetimeとして定義されていますか? – RadBrad

+0

'start_date'は' date'として定義され、 'start_time'は' time'として定義されます。 'start_time'をオプションにすることができるように、それらを別々のフィールドとして保管しました。 – user1116573

+0

start_timeがオプションの場合、start_atを設定しようとしているときに何を確認しますか?おそらく2つのケースが必要でしょうか? 1つはそれがあるときと1つはないときのために?私の場合、starting_atは私がdbに保存していたオブジェクトでした。どのように変数を宣言していますか? – RyanJM

答えて

0

私はdate_validator gemを使用していませんが、はこの種のことをかなりうまく行い、より積極的に維持されているようです。ここで

+0

返信ありがとうThilo。私はdate_validator gemに移動する前にその宝石を使ってみました。私は空白を許可する必要があり、バリデーションを適用しているフィールドで空白を許可するvalidates_timelinessのバグがあるようです。 date_validatorの宝石ももっと簡単だったようです。 Date_validatorは時間を検証するようには見えないので、日付と日付をマージして、検証できる日時を取得しようとしています。 – user1116573

関連する問題