2013-04-01 6 views
7

रेलस्कास्ट ने रिफैक्टरिंग पर एक शानदार एपिसोड डाला। एक तरीका जटिल नियंत्रक तर्क को मॉडल ऑब्जेक्ट्स को दबाए रखने के बजाय सेवा ऑब्जेक्ट्स में ले जाना है। one service object में, निम्न कोड प्रयोग किया जाता है:इस रूबी विधि परिभाषा में 'नया' कीवर्ड कैसे काम करता है?

class PasswordReset 
    attr_reader :user 

    def self.from_email(email) 
    new User.find_by_email(email) 
    end 

    def self.from_token(token) 
    new User.find_by_password_reset_token!(token) 
    end 
    ... 
end 

क्या new कुंजी शब्द दोनों विधि निकायों में सेवा करता है? new User.find_by_। यह User.find_by_ से अलग कैसे है?

def create # controller 
    password_reset = PasswordReset.from_email(params[:email]) 
    if password_reset.user 
     password_reset.send_email 
     redirect_to root_url, notice: "Email sent with password reset instructions." 
    else 
     redirect_to new_password_reset_url, alert: "Email address does not match a user account." 
    end 
    end 

इसके अलावा, क्यों attr_reader :user की जरूरत:

यहाँ बुला कोड है?

+0

आप शीर्षक पुनर्लेखन कर सकते हैं तो यह एक को दर्शाता है वास्तविक प्रश्न आप जानना चाहते हैं? आप आकर्षक चीज का उपयोग करके अधिक मछली पकड़ लेंगे। –

उत्तर

10

कक्षा का नाम स्वयं विधियों में निहित है।

def self.from_email(email) 
    PasswordReset.new User.find_by_email(email) 
end 

अपने प्रश्न के 2 आधा उत्तर देने के लिए, attr_reader एक उदाहरण चर और एक पाठक विधि (गेटर विधि उर्फ ​​अगर आप से जावा या सी # आ रहे हैं) को परिभाषित करता है: कोड की तरह लिखा जा सकता था। यह सब एक साथ रखें, आप के रूप में यह लिख सकता:

class PasswordReset 


    def user 
    @user 
    end 

    def self.from_email(email) 
    PasswordReset.new User.find_by_email(email) 
    end 

    def self.from_token(token) 
    PasswordReset.new User.find_by_password_reset_token!(token) 
    end 
    ... 
end 

यह मानते हुए है passwordreset # प्रारंभ एक पैरामीटर के रूप में एक उपयोगकर्ता लेता है, और @user तदनुसार सेट

+1

@dae, User.find_by_email (ईमेल) पासवर्ड रीसेट कन्स्ट्रक्टर के लिए तर्क है। – Fivell

+0

अब मैं समझता हूं। धन्यवाद। हालांकि, यह अजीब लगता है, कि आप तुरंत ऑब्जेक्ट की तुलना में किसी ऑब्जेक्ट को तत्काल कर रहे हैं। क्या इस पैटर्न के लिए कोई नाम है या यह सामान्य है? क्षमा करें, मुझे पता है कि मैं धीमी हूँ। मुझे रूबी में सोचने के लिए उपयोग नहीं किया जाता है, मुझे लगता है। मुझे लगता है कि 'attr_reader' रिटर्न 'उपयोगकर्ता 'या' शून्य' है? क्या यह सिर्फ उदाहरण में 'उपयोगकर्ता' नामक चीज़ की तलाश में है? – dee

+2

एक कोड समीक्षा में मैं यह भी तर्क दूंगा कि नंगे 'नया' का उपयोग गैर-सहज ज्ञान युक्त है और किसी भी व्यक्ति को पूरी विधि को पढ़ने के लिए समर्थन दे रहा है, और शायद कक्षा भी, यह देखने के लिए कि क्या हो रहा है। 'PasswordReset.new' का उपयोग करना बहुत स्पष्ट और स्वयं-दस्तावेज है। यहां तक ​​कि 'नया (...) 'कोष्ठक में पैरामीटर के साथ भी एक सुधार हुआ होगा, इसलिए -1 जो ​​भी मूल रूप से कोड लिखा था, और एक क्लीनर/स्पष्ट समाधान का सुझाव देने के लिए +1। –

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