2011-05-20 6 views
23

को दिखाने के लिए एक उपयोगकर्ता एक नाम पहले से मौजूद है कि, मैं की तरह एक त्रुटि संदेश दिखाना चाहते हैं के साथ एक रिकॉर्ड बनाने की कोशिश करता है:रेल अनुकूलित करने के लिए कैसे ActiveRecord मान्यता त्रुटि संदेश विशेषता मान

name "some name" has already been taken

मेरे पास है ऐसा करने के लिए कोशिश कर रहा:

validates_uniqueness_of :name, :message => "#{name} has already been taken" 

लेकिन इस के बजाय तालिका नाम आउटपुट नाम विशेषता के मान की

उत्तर

36

2 बातें:

  1. सत्यापन संदेश Rails I18n style interpolation, जो %{value}
  2. कुंजी value बजाय name है का उपयोग करें, क्योंकि अंतर्राष्ट्रीयकरण के संदर्भ में, तुम सच में मॉडल के बाकी के बारे में परवाह नहीं है।

तो अपने कोड होना चाहिए:

validates_uniqueness_of :name, :message => '%{value} has already been taken' 
+1

अच्छा! मेरे जवाब से निश्चित रूप से क्लीनर। –

+1

यह जानना उपयोगी हो सकता है कि% {विशेषता} उपयोग के लिए भी उपलब्ध है। – zwalker

+0

'% {value}' अब रेल 4 में काम नहीं करता है। :(इस एप्लिकेशन के लिए –

16

यह यो की तरह दिखता है आप संदेश में Proc पास कर सकते हैं।

  1. :activerecord.errors.models.user.attributes.name.taken
  2. एक हैश ऐसा `{दिखता है की तर्ज पर एक प्रतीक:: मॉडल =>" उपयोगकर्ता ",: जब आप ऐसा करते हैं, तो आप दो पैरामीटर प्राप्त विशेषता =>" नाम ", : मूल्य => "माई नेम"}

तो अगर आप एक proc पर दो मापदंडों के लिए अनुमति देते हैं, आप attributes[:value] आइटम का उपयोग कर सकते हैं ऐसा नाम है जो इस्तेमाल किया गया था प्राप्त करने के लिए:

validates_uniqueness_of :name, 
         :message => Proc.new { |error, attributes| 
          "#{attributes[:value]} has already been taken." 
         } 
3

आप रेल के किन संस्करणों का प्रयोग करते हैं?

यदि रेल 3. तब मुझे समझ में आता है कि आपको :message => '%{value} has already been taken' का उपयोग करना चाहिए। मुझे रेल 2.3 के बारे में निश्चित नहीं है। - लेकिन किसी भी मामले में आप अपनी खुद की कस्टम सत्यापन बना सकते हैं जो आपको आवश्यकतानुसार करता है।

+0

, मैं रेल 2.3.4 का उपयोग कर रहा हूं – umar

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