31

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)
Victor Pudeyev
  • 4,296
  • 6
  • 41
  • 67

2 Answers2

55
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).

Kevin Sylvestre
  • 37,288
  • 33
  • 152
  • 232
Simone Carletti
  • 173,507
  • 49
  • 363
  • 364
29

Your module should look something like this:

module CommonValidations
  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

Then in your model:

class Post < ActiveRecord::Base
  include CommonValidations

  ...
end

I'm using ActiveSupport::Concern here to make the code a little clearer.

Veraticus
  • 15,944
  • 3
  • 41
  • 45
  • 1
    Is it possible to test it in Rails 2? For example in the Rails 3 you can use ActiveModel for creating a class Test ; end and include what we need. and then write specs for this module. But what about Rails 2 version is it possible? – oivoodoo Nov 08 '12 at 13:54