2012-07-07 24 views
27

कुछ सत्यापन अपने मॉडल में दोहराव कर रहे हैं:रेल मॉड्यूल mixin में सत्यापन डाल दिया?

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) 

उत्तर

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 

validates मैक्रो Includer के संदर्भ में मूल्यांकन किया जाना चाहिए में, डाल मॉड्यूल के नहीं (जैसे आप शायद कर रहे थे) मैं इस त्रुटि मिलती है। तो फिर अपने मॉडल में

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 

:

+4

मेरा मानना ​​है कि यह वास्तव में 'ActiveSupport :: Concerns' के बजाय' ActiveSupport :: Concern' 'होना चाहिए (मुझे इसे संपादित करने की अनुमति नहीं दी जाएगी क्योंकि यह एक एकल वर्ण संपादित है।) –

+0

@KyleDaigle हाँ आप सही हैं। मैंने मूल पोस्ट अपडेट किया। –

+0

क्या रेल में यह करने का कोई तरीका है 2 – CantGetANick

26

आपका मॉड्यूल कुछ इस तरह देखना चाहिए

class Post < ActiveRecord::Base 
    include CommonValidations 

    ... 
end 

मैं ActiveSupport::Concern यहाँ उपयोग कर रहा हूँ कोड एक छोटे से स्पष्ट करने के।

+1

क्या रेलवे 2 में इसका परीक्षण करना संभव है? उदाहरण के लिए रेल 3 में आप कक्षा परीक्षण बनाने के लिए ActiveModel का उपयोग कर सकते हैं; अंत में शामिल करें और हमें क्या चाहिए। और फिर इस मॉड्यूल के लिए चश्मा लिखें। लेकिन रेल 2 संस्करण के बारे में क्या यह संभव है? – oivoodoo

+2

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