Rails将验证放在模块mixin中?

Vic*_*box 29 ruby validation ruby-on-rails models

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

validates :name, :length => { :minimum => 2 }, :presence => true, :uniqueness => true
validates :name_seo, :length => { :minimum => 2 }, :presence => true, :uniqueness => true
Run Code Online (Sandbox Code Playgroud)

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

app/models/validations.rb:5: undefined method `validates' for Validations:Module (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

Sim*_*tti 50

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
Run Code Online (Sandbox Code Playgroud)

validates宏必须在包入的予以评价,而不是模块的(就像你可能在做).

  • 我相信它实际上应该是`ActiveSupport :: Concern`而不是`ActiveSupport :: Concerns`(不允许我编辑它,因为它是单个字符编辑.) (4认同)

Ver*_*cus 26

你的模块应该是这样的:

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
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中:

class Post < ActiveRecord::Base
  include CommonValidations

  ...
end
Run Code Online (Sandbox Code Playgroud)

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