-
-
Save coreyhaines/3305349 to your computer and use it in GitHub Desktop.
# I love the helpers, they help to make the intention clear. | |
# I want to be able to do this. That is, using the validation helpers inside a validator object, | |
# rather than having to do manual validation. | |
class EmployeeValidator < ActiveModel::Validator | |
def validate(record) | |
record.validates_presence_of :email | |
end | |
end | |
# After some reading, I realize I can do this | |
class EmployeeValidator < ActiveModel::Validator | |
def setup(employee_class) | |
user_class.validates_presence_of :email | |
end | |
def validate(record) | |
end | |
end | |
# This provides the ability to use the helpers from a validator object. | |
# Now, I'm working on a way to bypass the validations from examples | |
# that aren't concerned with the validity of an object, such scope examples. | |
# Unfortunately, the setup method is called once when validates_with is called | |
# since ActiveRecord caches the validation objects. So, it has already been called | |
# and configured with the validation before a non-validation-oriented example | |
# can use it. So, no over-riding. | |
# Looking at the way validation helpers work, they all are backed by a subclass of | |
# Validator (or EachValidator), so you should be able to instantiate one and use it. | |
class EmployeeValidator < ActiveModel::Validator | |
def validate(record) | |
ActiveModel::Validations::PresenceValidator.new(attributes: [:first_name]).validate record | |
end | |
end | |
# This works for doing the validation. | |
# Yes, this is ugly, but we can wrap it in a helper, perhaps even having Active Record models | |
# expose the helpers on an instance level. | |
# However, when our example runs that wants to bypass them, it keeps using the old version. | |
# I want to be able to do this at the top of my validation-less example. | |
class EmployeeValidator < ActiveModel::Validator | |
def validate(record); end | |
end | |
# But, because the instance of the validator is cached when validates_with EmployeeValidator is | |
# called, my over-ride does not cut in. Boo! | |
# ActiveModel::Validations uses hooks to call the validations. | |
# Is there a way to disable the hook for a single example? | |
What do you think about the idea that one of a number of User validation classes could be used in different contexts.
I'm starting to think it could be an anti-pattern. If there are different validation rules based on the context, then the User model should probably be broken up.
@codesoda Yeah, it does feel like an anti-pattern to have different validations based on different contexts of use. In production, you want the validations to run, it is just in the example (e.g. scope specs) that I don't want them to run.
@coreyhaines I knew if I creeped up in your gists I'd find something like this. Did you figure out how to disable in a test context?
I like the helpers as well but am thinking a PORO approach may be easier. Inject a NilValidator in some kind of test context. Currently working on this so I'll post whatever I come up with.
Cool. ActiveModel::Validator looks nice, and I've got this working, now just figuring out how to disable them if I don't want them.