2010-01-27 12 views
8

मैं अपने फ़ील्ड नामों के लिए कस्टम त्रुटि संदेश चाहता था। मैं एक पर ठोकर खाई अतः questionरेल में वैध संख्यात्मकता के लिए कस्टम त्रुटि संदेश

तो मैं कुछ इस तरह कहा:

class Product < ActiveRecord::Base 
    validate do |prod| 
    prod.errors.add_to_base("Product price can't be blank") if prod.prod_price.blank? 
    end 
end 

लेकिन मैं यह भी prod_price की numericality जाँच करना चाहते हैं। अगर मैं सिर्फ validate_numericality_of :prod_price जोड़ता हूं और उत्पाद की कीमत खाली होती है तो त्रुटि संदेश दोनों दिखाई देते हैं (खाली और कोई संख्या नहीं है)।

मैं केवल 'संख्या नहीं है' त्रुटि संदेश केवल तभी दिखाया जा सकता है जब उत्पाद की कीमत खाली न हो?

मैं

class Product < ActiveRecord::Base 
    validate do |prod| 
    prod.errors.add_to_base("Product price can't be blank") if prod.prod_price.blank? 
    if !prod.prod_price.blank? 
     prod.errors.add_to_base("Product price must be a number") if prod.prod_price.<whatdo i put here> 
    end 
    end 
end 

भी कर रही है की कोशिश की, मैं कैसे के लिए एक कस्टम संदेश हो सकता है 'एक नंबर नहीं है।' मैं उपयोगकर्ता को अपना कॉलम नाम दिखाना छिपाना चाहता हूं।

उत्तर

5

आपके पास अपनी मान्य विधि लिखने के बिना कस्टम संदेश हो सकते हैं। बस :message जोड़ें:

validates_presence_of :prod_price, :message => "Product price can't be blank"

आप numericality सत्यापन जब prod_price मौजूद नहीं है छोड़ना चाहते हैं, तो जोड़ें: allow_nil:

validates_presence_of :prod_price, :message => "Product price can't be blank" validates_numericality_of :prod_price, :allow_nil => true

फिर numericality जांच जब तक नहीं चलेंगे prod_price गुम है।

संपादित करें:

प्रतीक्षा, आप नहीं फ़ील्ड नाम त्रुटि संदेश में दिखाना चाहते हैं, है न? मैंने यह खो दिया। तो आपको सभी के बाद कस्टम सत्यापन की आवश्यकता होगी।

संपादित करें # 2:

ठीक है कि कैसे इस बारे में तो:

protected 

def validate 
    if prod_price.blank? 
    errors.add "Product price can't be blank" 
    else 
    begin 
     Integer(attributes_before_type_cast["prod_price"]) 
    rescue ArgumentError 
     errors.add "Product price must be a number" 
    end 
    end 
end 
+0

हाँ ... इस सभी गड़बड़ – Omnipresent

1

कारणों की एक बहुत कुछ के लिए, जब तक आप, आप विशिष्ट क्षेत्रों के लिए त्रुटि संदेश संलग्न किया जाना चाहिए कुछ असामान्य करने की जरूरत है (यह यूनिट परीक्षण करना आसान है, बाद में त्रुटियों को संशोधित करना आसान है, यदि आप चाहें तो अमान्य फ़ील्ड के बगल में मार्कर प्रदर्शित कर सकते हैं, आदि)। मुझे लगता है कि आप क्या करना इस के साथ पूरा किया जा सकता हैं:

class Product < ActiveRecord::Base 
    validates_numericality_of :name, :if => lambda{ |obj| obj.prod_price? } 
    validates_presence_of :name 
end 
+0

से बचने के लिए मेरे कॉलम नामों को बेहतर नाम देना चाहिए था लेकिन यह त्रुटि संदेश में फ़ील्ड नाम दिखाएगा। मैं उससे दूर जाना चाहता हूँ। आपके कोड – Omnipresent

+0

के कस्टम संदेशों के साथ कैसे शामिल किया जा सकता है, मैं आपको यह संशोधित करने के लिए प्रोत्साहित करता हूं कि रेल कैसे फ़ील्ड त्रुटि संदेशों को प्रस्तुत करता है (हो सकता है कि मानवीय फ़ील्ड नाम को एआर त्रुटि संदेशों को कैसे पूर्ववत न करें)। आधार पर सभी त्रुटियों को जोड़ना एक महान डिजाइन नहीं है। अपनी कार के इंजन को प्रतिस्थापित न करें क्योंकि आपको रंग पसंद नहीं है! –

0

मैं इतना

class User < ActiveRecord::Base 

    HUMANIZED_ATTRIBUTES = { 
    :email => "E-mail address" 
    } 

    def self.human_attribute_name(attr) 
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super 
    end 

end 

इस तरह से मैं न प्रत्येक क्षेत्र के लिए कस्टम संदेश लिखने के लिए है सवाल दूसरे से इस दृष्टिकोण लिया। मैं सिर्फ उपयोगकर्ता

+0

अरे, यह बहुत बेहतर है! – zetetic

0
if prod.prod_price.blank? 
    prod.errors.add_to_base("Product price can't be blank") 
elsif prod.prod_price.match(/[^\d]/) 
    prod.errors.add_to_base("Product price must be a number") 
end 
3

currently accepted answer काम करता है के लिए प्रस्तुत fild नाम बदलते हैं, लेकिन यहां रेल 'i18n का उपयोग कर यह करने के लिए एक डेटा संचालित तरीका है:

allow_blank: truevalidates_numericality_of को जोड़ना खाली समस्या का ख्याल रखना होगा ।

फिर आप i18n का उपयोग स्वचालित रूप से आपके लिए विशेषता नामों का अनुवाद करने के लिए कर सकते हैं (दस्तावेज़ here)। prod_price के लिए आप सिर्फ en.yml को यह जोड़ेंगे:

en: 
    activerecord: 
    attributes: 
     product: 
     prod_price: "Product price" 

अब के लिए एक नंबर हिस्सा होना चाहिए, हम फिर i18n उपयोग कर सकते हैं। the docs से:

सक्रिय रिकॉर्ड सत्यापन त्रुटि संदेशों का भी आसानी से अनुवाद किया जा सकता है। सक्रिय रिकॉर्ड आपको कुछ नामस्थान देता है जहां आप कुछ संदेश, विशेषताओं और/या सत्यापन के लिए अलग-अलग संदेश और अनुवाद प्रदान करने के लिए अपना संदेश अनुवाद डाल सकते हैं।

उन नामस्थान here है, जहां आप देख सकते हैं कि एक numericality validataion के लिए संदेशnot_a_number है की एक आसान तालिका नहीं है।

तो अब हम en.yml इस प्रकार है कि जोड़ सकते हैं:

en: 
    activerecord: 
    errors: 
     models: 
     product: 
      attributes: 
      prod_price: 
       not_a_number: "must be a number" 

अब जब सत्यापन विफल हो जाता है कि यह दो जोड़ देंगे, आप को देने के लिए: उत्पाद की कीमत एक नंबर होना चाहिए।

संबंधित मुद्दे