Victor Pudeyev
Victor Pudeyev

Reputation: 4538

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)

Upvotes: 31

Views: 14273

Answers (2)

Simone Carletti
Simone Carletti

Reputation: 176442

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

Upvotes: 55

Veraticus
Veraticus

Reputation: 16064

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.

Upvotes: 29

Related Questions