2012-07-07 14 views
27

Alcuni convalide sono ripetitivi nei miei modelli:Rails mette la convalida in un mixin di moduli?

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

Come dovrei mettere che in un mixin? Ottengo questo errore se ho appena messo 'em in un mixin

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

risposta

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 

Il validates macro deve essere valutato nel contesto del Includer, non di modulo (come probabilmente stavano facendo).

+4

Credo che in realtà dovrebbe essere 'ActiveSupport :: Concern' invece di' ActiveSupport :: Concerns' (non permettermi di modificarlo perché è un singolo carattere di modifica.) –

+0

@KyleDaigle Sì, hai ragione. Ho aggiornato il post originale. –

+0

C'è un modo per farlo in binari 2 – CantGetANick

26

Il modulo dovrebbe essere simile a questo:

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 

Poi nel modello:

class Post < ActiveRecord::Base 
    include CommonValidations 

    ... 
end 

sto usando ActiveSupport::Concern qui per rendere il codice un po 'più chiaro.

+1

È possibile testarlo su Rails 2? Ad esempio in Rails 3 è possibile utilizzare ActiveModel per creare un test di classe; fine e includere ciò di cui abbiamo bisogno. e quindi scrivere le specifiche per questo modulo. Ma che dire della versione di Rails 2 è possibile? – oivoodoo

+2

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

Problemi correlati