Rails将validation放在模块mixin中?

在我的模型中,一些validation是重复的:

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

我怎么把它放在mixin中? 如果我把它们放在mixin中,我会收到这个错误

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

 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 

validates宏必须在包含器的上下文中进行评估,而不是在模块中进行评估(就像您可能正在做的那样)。

你的模块应该是这样的:

 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 

然后在你的模型中:

 class Post < ActiveRecord::Base include CommonValidations ... end 

我在这里使用ActiveSupport :: Concern来使代码更清晰一些。