2010-05-08 13 views

उत्तर

50

attr_accessor उन मानों के लिए उपयोग किया जा सकता है जिन्हें आप सीधे डेटाबेस में स्टोर नहीं करना चाहते हैं और यह केवल वस्तु के जीवन (जैसे पासवर्ड) के लिए मौजूद होगा। , Terms_of_service:

def instance_value 
    "my value" 
end 
62

कभी नहीं, जब तक कि आपके पास इसकी विशिष्ट आवश्यकता न हो। स्वचालित डेटाबेस-समर्थित एक्सेसर्स आपके लिए बनाए जाते हैं, इसलिए आपको चिंता करने की आवश्यकता नहीं है।

कोई भी attr_accessor जो आप बनाते हैं, वह रेल ऑब्जेक्ट पर प्रासंगिक @attr बदल देगा, लेकिन ऑब्जेक्ट नष्ट होने पर यह खो जाएगा, जब तक कि आप इसे डेटाबेस में वापस नहीं ले जाते। कभी-कभी आप यह व्यवहार चाहते हैं, लेकिन रेल ऐप में यह असामान्य है।

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

+4

सही - धन्यवाद। (मैं प्लस आप वोट चाहते हैं, लेकिन मैं तो बस यहाँ पर गया और मैंने 15pts पहले की जरूरत है लगता है ... यही कारण है कि मैकेनिक नए उपयोगकर्ताओं के लिए अमित्र लगता है।) – Ethan

+2

नोट: रेल के रूप में 3.x 'attr_accessible' आवश्यकता है (डिफ़ॉल्ट रूप से) प्रत्येक मॉडल के लिए जिनके गुण आप लिखने की अनुमति देना चाहते हैं (उदाहरण के लिए एक फॉर्म POST के माध्यम से)। पिछली संगतता के लिए इसे 'application.rb' में बदला जा सकता है, लेकिन सुरक्षा उपायों के रूप में जोड़ा गया था ताकि आपको उन उपयोगकर्ताओं द्वारा स्पष्ट रूप से श्वेतसूची की आवश्यकता हो जो _should_ उपयोगकर्ताओं द्वारा अपडेट करने योग्य हो। एक अतिरिक्त लाभ के रूप में, एक मॉडल की विशेषताओं (db कॉलम) के सभी मॉडल में वहीं दिखाई दे रहे हैं, तो आप क्या बिल्ली है कि स्तंभ :-) –

1

आप इसे उपयोग कर रहे हैं terms_of_service की स्वीकृति को मान्य करने के लिए, आप वास्तव में पुष्टि के उपयोग पर विचार करना चाहिए:

attr_reader कुछ इस तरह कर रही करने के लिए कई विकल्प के रूप में इस्तेमाल किया जा सकता स्वीकृति => सच है। यह एक वर्चुअल विशेषता बनाएगा और यह अधिक संक्षिप्त है।

http://guides.rubyonrails.org/active_record_validations.html#acceptance

0

एक उदाहरण है कि एक धारावाहिक कॉलम में कई विकल्प संग्रहीत किए जाएं। यदि आप इन विकल्पों में से किसी एक के लिए टेक्स्ट फ़ील्ड रखने का प्रयास करते हैं तो फॉर्म बिल्डर शिकायत करेगा। आप इसे नकली करने के लिए attr_accessor का उपयोग कर सकते हैं, और फिर अद्यतन कार्रवाई में इसे क्रमबद्ध कॉलम में सहेज सकते हैं।

12

रेल मॉडल केवल रूबी वर्ग हैं जो ActiveRecord::Base से प्राप्त होते हैं। ActiveRecord रूबी क्लास की तालिका को संदर्भित करने वाले कॉलम नामों के लिए गेटर्स और सेटर्स को परिभाषित करने के लिए attr_accessor एस को नियोजित करता है। यह ध्यान रखना महत्वपूर्ण है कि यह केवल दृढ़ता के लिए है; मॉडल अभी भी रूबी कक्षाएं हैं।

def foo=(var) 
    @foo = var 
end 
:

def foo 
    @foo 
end 

attr_writer :foo निम्नलिखित के लिए एक शॉर्टकट है:

def foo=(var) 
    @foo = var 
end 

def foo 
    @foo 
end 

attr_reader :foo बस निम्नलिखित के लिए एक शॉर्टकट है:

attr_accessor :foo बस निम्नलिखित के लिए एक शॉर्टकट है

attr_accessor एक शोर है गेटर और सेटर के लिए tcut जबकि attr_readerगेटर और attr_writer के लिए शॉर्टकट है सिर्फ सेटर के लिए एक शॉर्टकट है।

रेल में, ActiveRecord इन गेटर्स और सेटर्स का उपयोग डेटाबेस को मान पढ़ने और लिखने के सुविधाजनक तरीके से करता है। लेकिन, डेटाबेस सिर्फ दृढ़ता परत है। आपको attr_accessor और attr_reader का उपयोग करने के लिए स्वतंत्र होना चाहिए क्योंकि आप किसी अन्य रूबी क्लास को अपने व्यावसायिक तर्क को सही ढंग से लिखने के लिए करेंगे।जैसा कि आपको डेटाबेस में बने रहने के लिए अपनी वस्तुओं के गुणों को प्राप्त करने और सेट करने की आवश्यकता है, तदनुसार attr_ का उपयोग करें।

और जानकारी:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

What is attr_accessor in Ruby?

+0

नामित किया गया था 'attr_reader याद करने की जरूरत नहीं है: foo' उत्पन्न करता है' foo' गेटर विधि, 'attr_writer: foo'' foo = 'सेटर विधि उत्पन्न करता है, 'attr_accessor: foo' दोनों' foo' और 'foo =' विधियों को उत्पन्न करता है। – Fatih

+0

+1 फ़तिह। संपादन के लिए धन्यवाद। मैंने आपकी टिप्पणी को शामिल करने के लिए अपनी प्रतिक्रिया संपादित की है – brycemcd

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