web-dev-qa-db-ja.com

Rails検証をモジュールミックスインに入れますか?

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

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

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

app/models/validations.rb:5: undefined method `validates' for Validations:Module (NoMethodError)
29
Victor Pudeyev
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マクロは、モジュールではなく、インクルーダーのコンテキストで評価する必要があります(おそらく行っていたように)。

50
Simone Carletti

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

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

26
Veraticus