-
-
Save thechrisoshow/2236521 to your computer and use it in GitHub Desktop.
class Banana < ActiveRecord::Base; end | |
banana = Banana.new | |
banana.valid? #=> true | |
banana.singleton_class.validates_presence_of :name | |
banana.valid? #=> true - why did the validation not work? | |
banana.class.validates_presence_of :name | |
banana.valid? #=> false - as we'd expect...but now... | |
new_banana = Banana.new | |
new_banana.valid? #=> false - because the previous call soiled the Banana class with it's validation | |
# So how does one apply validations to the eigenclass of an ActiveRecord object? | |
# Or am I misunderstanding what .singleton_class is? |
class class User
before_validation :add_instance_validations
private
def add_instance_validations
singleton_class.class_eval { validates :name, presence: true }
end
end
I actually just blogged bout this, if anyone is still in need of a solution
http://dvg.github.io/2015/03/05/apply-activemodel-validations-by-policy.html
wrote an article specially answering this topic: http://www.eq8.eu/blogs/22-different-ways-how-to-do-rails-validations :)
A method that is directly built into Rails: https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/with.rb#L115-L123
class Person
include ActiveModel::Validations
validate :instance_validations, on: :create
def instance_validations
validates_with MyValidator, MyOtherValidator
end
end
A method that is directly built into Rails: https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/with.rb#L115-L123
class Person include ActiveModel::Validations validate :instance_validations, on: :create def instance_validations validates_with MyValidator, MyOtherValidator end end
This solution is not corresponding with the initial subdmision. What the author need is to be able to "inject" as ad-hoc a validator without affecting to the Base class.
Another solution would be using a Form Object and defining the validations depending on the context where they're used.