Спасибо, Милан, за ваше предложение. Вдохновленный этим, я создал простой модуль, который можно использовать для добавления этой функциональности в любой класс. Обратите внимание, что исходное предложение Милана имеет логическую ошибку в виде строки:
return mock.errors.has_key?(attr)
должно быть ясно:
return (not mock.errors.has_key?(attr))
Я проверил свое решение, и оно должно работать, но я не даю никаких гарантий. И вот мое великолепное решение. В основном это 2 строки, если вы убираете содержимое модуля. Он принимает имена методов как строки или символы.
module SingleAttributeValidation
def self.included(klass)
klass.extend(ClassMethods)
end
module ClassMethods
def valid_attribute?(attr, value)
mock = self.new(attr => value)
(not mock.valid?) && (not mock.errors.has_key?(attr.class == Symbol ? attr : attr.to_sym))
end
end
end