Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)
like image 259
Victor Pudeyev Avatar asked Jul 07 '12 05:07

Victor Pudeyev


2 Answers

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

like image 125
Simone Carletti Avatar answered Sep 23 '22 00:09

Simone Carletti


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.

like image 38
Veraticus Avatar answered Sep 24 '22 00:09

Veraticus