2010-09-08 10 views
33

मुझे पता है कि मैं आसानी से एक फ़ंक्शन लिख सकता हूं और इसे एप्लिकेशन नियंत्रक में डाल सकता हूं, लेकिन ऐसा नहीं होगा कि ऐसा कुछ और है जो पहले से ही करता है। असल में मैं कुछ ऐसा करना चाहता हूं:रेल (या रूबी): हां/नहीं सही/गलत

>> boolean_variable? 
=> true 
>> boolean_variable?.yesno 
=> yes 
>> boolean_variable?.yesno.capitalize 
=> Yes 

क्या पहले से ही रेल फ्रेमवर्क में ऐसा कुछ है?

+0

http://stackoverflow.com/questions/15047745/how-to-implement-yes-no-instead-of-boolean-for-certain-cases-in-rails – Hugo

उत्तर

35

ऐसा कोई अंतर्निहित सहायक मौजूद है, लेकिन इसे लागू करने के तुच्छता आसान है:

class TrueClass 
    def yesno 
    "Yes" 
    end 
end 

class FalseClass 
    def yesno 
    "No" 
    end 
end 
+1

अरे, यह slicker तो मैं क्या आया होगा। जहां तक ​​रेल ऐप का संबंध है, इस कोड को रखने के लिए सबसे अच्छी जगह कहां होगी? lib या कुछ के तहत एक फाइल में? – DJTripleThreat

+0

मैं "boolean_path.rb" नामक कॉन्फ़िगर/प्रारंभकर्ता पथ में एक कस्टम प्रारंभकर्ता बनाउंगा। इस तरह, ये नए तरीके ऐप के माध्यम से उपलब्ध होंगे। चीयर्स! – Eytan

+1

@Eytan मैं रूबी और रेल के लिए नया हूं और मैं सम्मेलन के साथ चिपकने की कोशिश कर रहा हूं लेकिन मुझे नहीं पता कि इंटियालाइज़र कैसे बनाया जाए, क्या आप इसके साथ मेरी मदद कर सकते हैं? असल में मैं उस boolean_path.rb में क्या रखूंगा और मैं इसका उपयोग कैसे कर सकता हूं? मैं क्या करना चाहता हूं जब मैं अपना मॉडल बनाउंगा, तो मैं नियमित बुलियन के बजाय t.boolean_yesno का उपयोग करना चाहता हूं और उस आउटपुट को सही या गलत के बजाय हां या नहीं है। यदि आप चाहें तो मैं इसके लिए एक और सवाल खोलूंगा। – GiH

14

वैकल्पिक रूप से, आप भी इस तरह के रूप में अपने विचारों में एक नापसंद कर सकता है:

<%= item.bool_field? ? 'yes' : 'no' %> 
+1

यह अन्य समाधान की तुलना में बहुत शुष्क नहीं है और स्थानीयकरण करना मुश्किल होगा। –

+5

नहीं, जेफ, आप बिल्कुल सही हैं। मैं * एक * ऑफ से बात कर रहा था, न कि * कई * ऑफ्स के लिए, और बाद के मामले में, एक सहायक व्यक्ति निश्चित रूप से बुद्धिमान (और डीआरवाई) विकल्प होगा, जैसा कि आप बताते हैं। – patrickhawley

+0

बिल्कुल सही! मेरे पास एक फॉर्म ऐप है, इसलिए मुझे स्थानीयकरण/डीआरवाई (अभी तक) की परवाह नहीं है। उसके लिए धन्यवाद। –

34

वहाँ isn ' रेल में कुछ नहीं।

सही/गलत वर्गों को जोड़ने ऐसी ही कुछ प्राप्त करने के लिए ApplicationHelper में एक विधि बनाने के लिए किया जाएगा की तुलना में एक बेहतर तरीका: करने के लिए

<%= human_boolean(boolean_youre_checking) %> 

जोड़ना तरीकों आपके विचार में,

def human_boolean(boolean) 
    boolean ? 'Yes' : 'No' 
end 

फिर अंतर्निर्मित वर्ग आमतौर पर फेंक दिया जाता है। इसके अलावा, यह दृष्टिकोण raw() जैसे रेल के हेल्पर्स के करीब मिलकर फिट बैठता है।

इसके अलावा, एक ऑफसेट एक अच्छा विचार नहीं है क्योंकि उन्हें आसानी से बनाए रखा नहीं जाता है (या परीक्षण किया जाता है)। humanize_boolean

तो फिर तुम बस करो:

true.humanize # => "Yes" 
false.humanize # => "No" 

ताकि आप आसानी से en.boolean के लिए आपके अनुवाद सहित द्वारा वापस स्ट्रिंग बदल सकते हैं यह भी अंतर्राष्ट्रीयकरण का समर्थन करता है

+0

वास्तव में वह किया था। धन्यवाद! –

20

है कि अब के लिए एक मणि है। हाँ और en.boolean.no (या किसी भी स्थान आप की तरह)

+1

+1 धन्यवाद, माइक! – DJTripleThreat

11

humanize_boolean मणि फैली TrueClass, FalseClass और NilClass जो एक अप्रत्यक्ष विस्तार मैं है से बचना पसंद करेंगे।

मैं एक शीर्ष स्तर अनुवाद के साथ इस सहायक अलग है, अनुकूल पाया है बदलने के लिए और आप इसे कुछ भी truthy या falsey दे सकते हैं:

# app/helpers/application_helper.rb 
class ApplicationHelper 
    def humanize_boolean(boolean) 
    I18n.t((!!boolean).to_s) 
    end 
end 

# config/locales/en.yml 
en: 
    :true: 'Yes' 
    :false: 'No' 

!!(boolean).to_s कर चर तर्क के लिए पारित सुनिश्चित करता है या तो एक अनुवाद स्ट्रिंग का निर्माण करते समय "true" या "false" मान।

उपयोग में:

# app/views/chalets/show.html.erb 
<%= humanize_boolean(chalet.rentable?) %> 
संबंधित मुद्दे