Search code examples
ruby-on-railsrubyvalidationmodels

Rails put validation in a module mixin?


Some validations are repetitive in my models:

validates :name, :length => { :minimum => 2 }, :presence => true, :uniqueness => true
validates :name_seo, :length => { :minimum => 2 }, :presence => true, :uniqueness => true

How would I put that in a mixin? I get this error if I just put 'em in a mixin

app/models/validations.rb:5: undefined method `validates' for Validations:Module (NoMethodError)

Solution

  • module Validations
      extend ActiveSupport::Concern
    
      included do
        validates :name, :length => { :minimum => 2 }, :presence => true, :uniqueness => true
        validates :name_seo, :length => { :minimum => 2 }, :presence => true, :uniqueness => true
      end
    end
    

    The validates macro must be evaluated in the context of the includer, not of the module (like you probably were doing).