1

EDIT: В случае, если приведенный ниже вопрос выглядит немного «обширным», резюме состоит в том, что я просто хочу комбинировать поле даты и необязательное поле времени в моей модели исключительно для этой цели проверки его с помощью валидатора дат, но я не могу проверить, что мой тест завершился неудачно, когда я передаю строку как время.Подтвердить поля даты и времени вместе в модели rails


EDIT 2: Так как я до сих пор пытаюсь найти способ, чтобы присоединиться объектом даты с временным объектом с целью проверки, то я подумал, если я мог бы просто проверить, что значение времени было объект Time используя is_a?(Time) (а не неверную строку), но это, похоже, не работает, и я подумал, было ли это из-за Time mention with this method (но я не совсем понимаю, достаточно ли знать, вызывает ли это проблему или нет.

Я также задавался вопросом, может ли to_time method помочь мне проверить, есть ли что-то объект времени, но я не уверен, как.

Надеюсь, кто-то может либо посоветовать, как присоединиться к объекту 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?


У меня есть мнение, похожий на Trying to set a variable in before_validation but it isn't working с тем, что использует календарь, чтобы выбрать день и падение падения, чтобы выбрать время. Я попытался применить то же самое к своей модели, но не смог заставить ее работать, так как я немного новичок в рубине и испытываю трудности с заполнением пробелов, оставленных ответом.

В моей модели есть поля start_date и start_time.

Мне нужно объединить эти два поля так, чтобы я мог проверить их вместе как дату и время (используя драгоценный камень date_validator), а не проверять дату и время отдельно, хотя они будут поступать в базу данных как отдельные поля, если кто-то не сможет убедить меня иначе (хотя я много делал с ними отдельно, поэтому не хочу этого менять).

Должна быть представлена ​​дата, но поле времени не является обязательным.

С другой стороны, похоже, мне нужен метод before_validation, который может объединить 2 поля по мере необходимости в виртуальное поле, которое затем можно проверить с помощью драгоценности date_validator.

EDIT: оригинальная ошибка была исправлена ​​благодаря RyanJM, но я все еще не могу пройти тест правильно. Ниже приведено текущее состояние игры.

Вот основы моей модели Showtime Сейчас:

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 

В случае, если это необходимо, вот основы/соответствующие части модели Performance:

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 

Надеюсь, что я не нарушил ничего в приведенном выше кодеке, пытаясь просто показать ne конечные части.

+0

Как его start_time фактически определены в базе данных? Является ли start_date определяемым как дата-время в вашей базе данных? – RadBrad

+0

'start_date' определяется как' date', а 'start_time' определяется как' time'. Я сохранил их как отдельные поля, чтобы «start_time» мог быть необязательным. – user1116573

+0

Если start_time не является обязательным, то что проверить, когда вы собираетесь установить start_at? Вероятно, вам понадобятся два случая? Один, когда он есть и один, когда это не так? В моем случае start_at был объектом, который я сохранял в db. Как вы объявляете переменную? – RyanJM

ответ

0

Я не использовал драгоценный камень date_validator, но делает это довольно хорошо, а также, кажется, более активно поддерживается.

+0

Спасибо за ответ Тило. Я пробовал использовать этот драгоценный камень, прежде чем переходить на драгоценный камень date_validator. Мне нужно разрешить пробел, и, похоже, есть ошибка с validates_timeliness, позволяющая пустым с полями, к которым применяется проверка. Кроме того, драгоценный камень date_validator был намного проще. Date_validator, похоже, не проверяет время, поэтому я пытаюсь объединить дату с моим временем, чтобы получить дату-время, которое я могу проверить. – user1116573

Смежные вопросы