Во-первых, позвольте мне сказать, что я чрезвычайно плохо знаком с направляющими (играл с ним время или два, но то, чтобы вынуждать меня записать завершенный проект с ним теперь, запущенный на нем вчера).
Я теперь пытаюсь проверить это свойство модели (терминология?) больше, чем другой. Это, казалось, было идеальным экземпляром для validates_numericality_of
с greater_than
опция, но увы который бросает ошибку при сообщении мне greater_than expects a number, not a symbol
. Если я пытаюсь преобразовать тип того символа .to_f
Я добираюсь undefined method
ошибка.
Вот то, что я в конечном счете сделал и мне любопытно относительно того, существует ли лучший путь. Это - просто простая система для управления выпусками проекта, у нас только есть главные/незначительные выпуски (одна точка), таким образом, плавание чувствовало себя подобно правильному решению здесь.
class Project < ActiveRecord::Base
validates_numericality_of :current_release
validates_numericality_of :next_release
validate :next_release_is_greater
def next_release_is_greater
errors.add_to_base("Next release must be greater than current release") unless next_release.to_f > current_release.to_f
end
end
Это работает - это передает соответствующий модульный тест (ниже для Вашего удовольствия просмотра), мне просто любопытно, относительно того, если существует более легкий путь - что-то, что я, возможно, попробовал иначе.
Соответствующий модульный тест:
# Fixture data:
# PALS:
# name: PALS
# description: This is the PALS project
# current_release: 1.0
# next_release: 2.0
# project_category: 1
# user: 1
def test_release_is_future
project = Project.first(:conditions => {:name => 'PALS'})
project.current_release = 10.0
assert !project.save
project.current_release = 1.0
assert project.save
end
Как вы заметили, единственный способ - использовать собственный валидатор. Параметр: better_than должен быть целым числом. Следующий код не будет работать, потому что и текущий, и следующий выпуск доступны только на уровне экземпляра.
class Project < ActiveRecord::Base
validates_numericality_of :current_release
validates_numericality_of :next_release, :greater_than => :current_release
end
Цель параметра better_than
- проверить значение на соответствие статической константе или другому методу класса. .
Так что не возражайте и используйте свой собственный валидатор. :)
Это лучший способ выполнить пользовательскую валидацию, однако, вы, возможно, захотите изучить нечто наподобие factory_girl в качестве замены исправления (которое, похоже, вы используете):
http://github.com/thoughtbot/factory_girl
Тогда ваш юнит-тест будет выглядеть следующим образом:
def test_...
Factory.create(:project, :current_release => 10.0)
assert !Factory.build(:project, :current_release => 1.0).valid?
end