30

私のモデルでは、いくつかの検証が繰り返されます。

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

それをミックスインに入れるにはどうすればよいですか?ミックスインに入れるだけでこのエラーが発生します

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

2 に答える 2

53
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マクロは、モジュールではなく、インクルーダーのコンテキストで評価する必要があります(おそらく行っていたように)。

于 2012-07-07T05:37:52.760 に答える
29

モジュールは次のようになります。

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を使用しています。

于 2012-07-07T05:38:23.240 に答える