2012-07-07 8 views
27

Algunas validaciones son repetitivas en mis modelos:Los rieles ponen la validación en un módulo mixin?

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

¿Cómo voy a poner eso en un mixin? Me sale este error si acabo de poner 'em en un mixin

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

Respuesta

44
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 

La macro validates debe ser evaluado en el contexto de la Includer, no de módulo (como es probable que estaba haciendo).

+4

Creo que debería ser 'ActiveSupport :: Concern' en lugar de' ActiveSupport :: Concerns' (No me dejaría editarlo porque es una edición de un solo carácter) –

+0

@KyleDaigle Sí, tienes razón. Actualicé la publicación original. –

+0

¿Hay alguna manera de hacer esto en rails 2 – CantGetANick

26

Su módulo debe ser algo como esto:

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 

Luego, en su modelo:

class Post < ActiveRecord::Base 
    include CommonValidations 

    ... 
end 

estoy usando ActiveSupport::Concern aquí para hacer que el código un poco más claro.

+1

¿Es posible probarlo en Rails 2? Por ejemplo, en Rails 3 puede usar ActiveModel para crear una clase Test; finalizar e incluir lo que necesitamos. y luego escribir especificaciones para este módulo. Pero, ¿qué pasa con la versión de Rails 2? ¿Es posible? – oivoodoo

+2

http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord – CantGetANick

Cuestiones relacionadas