2010-11-02 16 views
6

मेरे पास एक 'ईमेल' फ़ील्ड वाला उपयोगकर्ता मॉडल है।रेल: फ़ील्ड नाम

<%= form_for(:user) do |f| %> 
    <%= f.label :email, 'Email address' %><br/
    <%= f.text_field :email %> 
<% end %> 

हालांकि, जब सत्यापन त्रुटियों उत्पन्न कर रहे हैं, 'ईमेल' के बजाय प्रयोग किया जाता है:

मेरे विचार में, मैं इस प्रकार के रूप में 'ईमेल पता' इस क्षेत्र के लिए लेबल प्रदान की है

ईमेल हमेशा 'ईमेल पता' बजाय बस 'ईमेल' के प्रस्तुत करता है:

ईमेल अमान्य

है कि वहाँ कुछ मैं मॉडल के लिए जोड़ सकते हैं ताकि है?

बहुत धन्यवाद

उत्तर

4

GJB टिप्पणियों का विस्तार, मैं सिर्फ यह जोड़ा config/initializers/inflections.rb:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.human 'email', 'Email address' 
end 

मुझे लगता है कि यह बहुत neater है।

+0

सहमत हैं, यह एक बहुत साफ समाधान है। – gjb

1
validates_presence_of :email, :message => "address cannot be blank" 
1

2 तरीके इस संभाल करने के लिए कर रहे हैं। (अनुशंसित) या तो EMAIL_ADDRESS या उपयोगकर्ता मॉडल में सत्यापन को संशोधित करने के अपने स्तंभ का नाम बदलने:

validates_presence_of :email, :message => "Address cannot be blank..." 

कौन सा प्रस्तुत करना चाहिए: "ई-मेल पता खाली नहीं हो सकता ..." अपने ध्यान में रखते हुए।

7

ऐसा करने के लिए आपको अपने टेबल कॉलम का नाम बदलने की आवश्यकता नहीं है। वहाँ एक बहुत साफ ठीक है:

class User < ActiveRecord::Base 
    HUMAN_ATTRIBUTE_NAMES = { 
    :email => 'Email address', 
    :first_name => 'First name' 
    } 

    class << self 
    def human_attribute_name attribute_name 
     HUMAN_ATTRIBUTE_NAMES[attribute_name.to_sym] || super 
    end 
    end 
end 

हम क्या किया है गुण है जहाँ हम नाम को अनुकूलित करना चाहते हैं की एक हैश पैदा करते हैं। आपको उन सभी को सूचीबद्ध करने की ज़रूरत नहीं है, क्योंकि कई विशेषता नाम बॉक्स के बाहर काम करेंगे जैसा आप चाहते हैं। फिर हम पहले हैश में नाम खोजने का प्रयास करने के लिए ActiveRecord की human_attribute_name विधि को ओवरराइड करते हैं।

यह दो वास्तव में अच्छी चीजें करता है: अब आपको अपने रूपों में कस्टम लेबल निर्दिष्ट नहीं करना होगा, और आपके त्रुटि संदेशों के नए नाम भी स्वचालित रूप से होंगे! एक बोनस के रूप में, अब आप इन नामों, फोन करके उपयोग कर सकते हैं भी आप चाहते हैं:

<%= User.human_attribute_name(:email) %> 

यह नामकरण करने के लिए एक और अधिक एकीकृत दृष्टिकोण पैदा करता है। यदि आप अगले सप्ताह "ईमेल" को "ई-मेल" में बदलना चाहते हैं, तो आपको केवल एक ही स्थान पर ऐसा करना होगा।

मुझे आशा है कि इससे मदद मिलती है!

+0

जैम, आप एक पूर्ण प्रतिभाशाली हैं। आपका बहुत बहुत धन्यवाद! – gjb

+1

यह पता चला है कि human_attribute_name वास्तव में inflections के पक्ष में बहिष्कृत है। अब मैं ActiveSupport :: Inflector.inflections {| inflect | पर बस गया हूं एक विकल्प के रूप में inflect.human 'ईमेल', 'ईमेल पता'}। – gjb

+1

मेरा मानना ​​है कि अब सत्य नहीं है। यह * कुछ साल पहले हटा दिया गया था, लेकिन पक्ष में वापस बढ़ गया है, और अब भी i18n समर्थन (कम से कम रेल 3 में) शामिल है। एक चलती लक्ष्य को मारना मुश्किल है, लेकिन मेरा मानना ​​है कि man_attribute_name अब chopping ब्लॉक पर नहीं है :) –

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