2010-05-01 14 views
12

मैं थोड़ी देर के लिए रेल के साथ काम कर रहा हूं और एक चीज जो मैं लगातार अपने आप को पाता हूं यह देखने के लिए जांच कर रहा है कि कुछ विशेषता या ऑब्जेक्ट मेरे दृश्य कोड में शून्य है । मुझे आश्चर्य है कि यह हमेशा सबसे अच्छा विचार है।रूबी पर रूबी में नील देखने के लिए जांच

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

बात यह है कि हालांकि मैं आमतौर पर विभिन्न कारणों से अपने मॉडल या नियंत्रक कोड में समान शून्य या अमान्य मान जांच करता हूं। मैं इसे सबसे सख्ती से कोड डुप्लिकेशंस नहीं कहूंगा, लेकिन यह बहुत ड्रवाई प्रतीत नहीं होता है। अगर मैंने पहले से ही अपने नियंत्रक में शून्य वस्तुओं की जांच की है तो यह ठीक है अगर मेरा विचार सिर्फ वस्तु को मानता है तो वास्तव में शून्य नहीं है? उन गुणों के लिए जो प्रदर्शित किए जा सकते हैं, यह हर बार जांचने के लिए मुझे समझ में आता है, लेकिन वस्तुओं के लिए मुझे यकीन नहीं है कि सबसे अच्छा अभ्यास क्या है।

यहाँ मैं के बारे में बात कर रहा हूँ का एक सरलीकृत, लेकिन विशिष्ट उदाहरण है:

नियंत्रक कोड

def show 
    @item = Item.find_by_id(params[:id]) 

    @folders = Folder.find(:all, :order => 'display_order') 

    if @item == nil or @item.folder == nil 
     redirect_to(root_url) and return 
    end 
end 

दृश्य कोड

<% if @item != nil %> 
    display the item's attributes here 

    <% if @item.folder != nil %> 
     <%= link_to @item.folder.name, folder_path(@item.folder) %> 
    <% end %> 
<% else %> 
    Oops! Looks like something went horribly wrong! 
<% end %> 

यह एक अच्छा विचार है या यह सिर्फ है मूर्ख?

उत्तर

6

आपका उदाहरण कोड पुनर्निर्माण:

नियंत्रक कोड। (मुझे लगता है इस ItemsController है)

def show 
    # This will fail with 404 if item is not found 
    # You can config rails to pretty much render anything on Error 404 
    @item = Item.find(params[:id]) 

    # doesn't seem to be used in the view 
    # @folders = Folder.find(:all, :order => 'display_order') 


    # this is not needed anymore, or should be in the Error 404 handler 
    #if @item == nil or @item.folder == nil 
    # redirect_to(root_url) and return 
    #end 
end 

दृश्य कोड, क्योंकि नियंत्रक यकीन है कि हमारे पास बनाया @item

#display the item's attributes here 

<%= item_folder_link(@item) %> 

सहायक कोड:

# display link if the item has a folder 
def item_folder_link(item) 
    # I assume folder.name should be a non-blank string 
    # You should properly validate this in folder model 
    link_to(item.folder.name, folder_path(item.folder)) if item.folder 
end 

वैसे भी, मैं दृश्य रखने की कोशिश बहुत ही सरल आम तौर पर यदि मैं विचारों में लूप और सशर्त देखता हूं, तो मैं उन्हें मददगारों में दोबारा करने की कोशिश करता हूं।

5

नहीं yuu

<% if @item.nil? %> 

का उपयोग करना चाहिए उदाहरण

@item1=nil 
if @item1.nil? ### true 
@item2 = "" 
if @item2.nil? ### false 
@item3 = [] 
if @item3.nil? ### false 
@item4 = {} 
if @item4.nil? ### false 

के लिए जाँच करने के लिए एक वस्तु खाली है अगर यह, झूठी खाली है, या एक खाली स्थान के स्ट्रिंग है।

उपयोग

<% if @item.blank? %> 

रेफरी: - this

उदाहरण के लिए

@item1=nil 
if @item1.blank? #### true 
@item2 = "" 
if @item2.blank? #### true 
@item3 = [] 
if @item3.blank? #### true 
@item4 = {} 
if @item4.blank? #### true 
0

आपका नियंत्रक निर्णय लेने से जो दृश्य प्रदान करने जा रहा है के लिए जिम्मेदार है। यदि आप सत्यापित कर सकते हैं कि आपका नियंत्रक कभी भी आइटम या item_folder के बिना इस विशेष दृश्य को प्रस्तुत नहीं करेगा तो आपको शून्य मानों की जांच करने की आवश्यकता नहीं है।

सत्यापित कर सकते हैं मेरा मतलब है कि आपके पास परीक्षण/चश्मे हैं जो जांचते हैं कि कौन सा दृश्य शून्य आइटम और item_folders के लिए प्रदान किया जाता है।

0

मैं व्यक्तिगत रूप से सोचता हूं कि यदि आप अपने विचारों में शून्य की जांच कर रहे हैं (और मुझे लगता है कि दृश्य के बाद अप्रत्याशित प्रस्तुति परत शून्य उस स्तर पर जांच की जानी चाहिए), तो आप इसे नियंत्रक में जांचना नहीं चाहते हैं।(लेकिन यह सभी स्थानों के लिए लागू नहीं होगा)

मैं अगर यह नहीं के बराबर है या नहीं

कुछ नहीं के बराबर की जाँच (यह थोड़ा सूखी बनाने के लिए) और अपने वस्तु गुजरती हैं और जांच करने के लिए एक विधि बनाने के लिए आप की सिफारिश करेंगे

def is_nil (ऑब्जेक्ट) object.nil? ? '': वस्तु अंत

और आवेदन नियंत्रक में जोड़ कर उसे एक सहायक बनाने (ताकि आप दोनों नियंत्रकों और विचारों में उपयोग कर सकते हैं)

(helper_method: is_nil - अपने आवेदन में यह पंक्ति जोड़ नियंत्रक)

और अब आप उस ऑब्जेक्ट को पास कर सकते हैं जिसे आप जांचना चाहते हैं कि यह शून्य है या नहीं।

चियर्स, समीरा

2

भूलना मत भूलना। रेल, 2.3 में जोड़ा गया था। इसका मतलब है कि आप निम्न की तरह कुछ कॉल कर सकते हैं:

@object.try(:name) 

और यदि @object शून्य है, तो कुछ भी वापस नहीं किया जाएगा। यह शायद sameera207 के विचार के लिए अंतर्निहित समाधान है।

आदर्श रूप से, आपको दृश्य के माध्यम से शून्य वस्तुओं को नहीं भेजना चाहिए - हालांकि यह हमेशा से बचना संभव नहीं है।

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