Использовать строку в качестве ввода даты с проверкой [duplicate]

Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext, на которые ссылается тестируемый код, должны быть изделены.

См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.

29
задан Pesto 15 September 2009 в 14:48
поделиться

6 ответов

Нет встроенного средства проверки ActiveRecord для DateTimes, но вы можете легко добавить эту возможность к модели ActiveRecord без использования плагина с чем-то вроде этого:

class Thing < ActiveRecord::Base
  validate :happened_at_is_valid_datetime

  def happened_at_is_valid_datetime
    errors.add(:happened_at, 'must be a valid datetime') if ((DateTime.parse(happened_at) rescue ArgumentError) == ArgumentError)
  end
end
41
ответ дан Gabe Hollombe 5 September 2018 в 07:23
поделиться

Необходимо подтвердить даты. С помощью получателей формы Rails по умолчанию вы можете выбрать даты, такие как 31 сентября.

-2
ответ дан Ariejan 5 September 2018 в 07:23
поделиться

В предыдущих версиях Rails перед валидацией будут значения типа cast , поэтому недопустимые значения будут передаваться как nil s в пользовательские валидаторы. Я делаю что-то вроде этого:

# app/validators/date_time_validator.rb
class DateTimeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if record.public_send("#{attribute}_before_type_cast").present? && value.blank?
      record.errors.add(attribute, :invalid)
    end
  end
end
# app/models/something.rb
class Something < ActiveRecord::Base
  validates :sold_at, date_time: true
end
# spec/models/something_spec.rb (using factory_girl and RSpec)
describe Something do
  subject { build(:something) }

  it 'should validate that :sold_at is datetimey' do
    is_expected.not_to allow_value(0, '0', 'lorem').for(:sold_at).with_message(:invalid)
    is_expected.to allow_value(Time.current.iso8601).for(:sold_at)
  end
end
7
ответ дан Halil Özgür 5 September 2018 в 07:23
поделиться

Вы можете самостоятельно создать собственный валидатор datetime

1) создать папку, называемую валидаторами внутри каталога приложения

2) создать файл datetime_validator.rb. со следующим содержимым внутри каталога приложений / валидаторов

 class DatetimeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if ((DateTime.parse(value) rescue ArgumentError) == ArgumentError)  
      record.errors[attribute] << (options[:message] || "must be a valid datetime")
    end
  end
end

3) Применить эту проверку на модели

class YourModel < ActiveRecord::Base
  validates :happend_at, datetime: true
end

4) Добавить нижнюю строку в application.rb

config.autoload_paths += %W["#{config.root}/app/validators/"]

5) Перезапустите приложение для рельсов

Примечание: описанный выше метод протестирован в рельсах 4

1
ответ дан Ramesh Kumar Thiyagarajan 5 September 2018 в 07:23
поделиться

Ответ Gabe не сработал для меня, так вот что я сделал, чтобы проверить мои даты:

class MyModel < ActiveRecord::Base
  validate :mydate_is_date?

  private

  def mydate_is_date?
    if !mydate.is_a?(Date)
      errors.add(:mydate, 'must be a valid date') 
    end
  end
end

Я просто хотел подтвердить, что дата на самом деле является датой, а не string, character, int, float и т. д.

Более сложную проверку даты можно найти здесь: https://github.com/codegram/date_validator

12
ответ дан Sauce McBoss 5 September 2018 в 07:23
поделиться

Я рекомендую камень date_validator. См. https://rubygems.org/gems/date_validator . Он хорошо поддерживается, и его API прост и компактен.

0
ответ дан Tsutomu 5 September 2018 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: