Проверьте поля даты и времени вместе в модели рельсов - PullRequest
1 голос
/ 31 марта 2012

РЕДАКТИРОВАТЬ: В случае, если приведенный ниже вопрос выглядит немного «обширным», в итоге я просто хочу объединить поле даты и дополнительное поле времени в моей модели исключительно с целью проверки его с использованием средства проверки даты, но яне могу заставить мой тест не пройти правильно, когда я передаю строку как время.


РЕДАКТИРОВАТЬ 2: Так как я все еще пытаюсь найти способ соединить объект даты с объектом временидля проверки я подумал, могу ли я просто проверить, что значение времени было объектом Time с использованием is_a?(Time) (а не недопустимой строки), но это тоже не сработало, и я подумал, могло ли это быть из-заTime упомяните этим методом (но я не совсем понимаю, достаточно ли этого, чтобы знать, вызывает ли это проблему или нет.

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

Надеюсь, кто-то может посоветовать, как присоединиться к объекту Date с помощьюha Time объект для проверки или, по крайней мере, скажите мне, как я могу проверить, что отправляемое значение времени является Time объектом, а не недопустимой строкой или чем-то.


РЕДАКТИРОВАТЬ 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?


У меня есть представление, подобное Попытка установить переменную в before_validation, но оно не работает с представлением, которое используеткалендарь, чтобы выбрать день, и выпадающий список, чтобы выбрать время.Я попытался применить то же самое к моей модели, но не смог заставить его работать, так как я немного новичок в ruby ​​и у меня были проблемы с заполнением пробелов, оставленных ответом.

У моей модели start_date иполя start_time.

Мне нужно объединить эти 2 поля только для того, чтобы я мог проверить их вместе как дату и время (используя гем 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

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

Ответы [ 2 ]

0 голосов
/ 15 июня 2012

Вот что, наконец, указало мне правильное направление: https://github.com/codegram/date_validator/issues/25#issuecomment-6126879

0 голосов
/ 14 апреля 2012

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

...