दिलचस्प पोस्ट
मुझे टोमकैट के कनेक्शन पूल के लिए जेडीबीसी ड्राइवर को कहाँ रखा है? आईओएस शुरू पृष्ठभूमि थ्रेड क्या href एट्रिब्यूट के बिना एंकर टैग सुरक्षित है? मोंगोज़: अद्वितीय होने के लिए फ़ील्ड के संयोजन को कैसे परिभाषित करना है? IXmlSerializable को लागू करने के लिए उचित तरीका है? Jquery चयनकर्ताओं में जावास्क्रिप्ट चर का उपयोग कैसे करें IPython नोटबुक स्थान त्रुटि प्रो Xcode डेवलपर आईडी तैयार पीकेजी जैसे ओएस एक्स इंस्टालर पैकेज बनाना कैसे जांचें कि सी ++ कंपाइलर आईईईई 754 फ़्लोटिंग प्वाइंट स्टैंडर्ड का उपयोग करता है मैं समानांतर कैसे सीमित कर सकता हूं। XmlDocument.SelectSingleNode और xmlNamespace समस्या मैं टीपीएल कार्य को कैसे रद्द / रद्द कर सकता हूं? एक पायथन वर्ग के __dict __.__ dict__ विशेषता क्या है? पायथन में मूल्यों को पास करना आप यह सुनिश्चित कैसे करते हैं कि आप जिस प्रोग्राम को ईमेल भेजते हैं वह स्पैम के रूप में स्वचालित रूप से चिह्नित नहीं है?

Attr_accessor और attr_accessible के बीच का अंतर

रेल में, attr_accessor और attr_accessible बीच अंतर क्या है? मेरी समझ से, attr_accessor का उपयोग उस चर के लिए attr_accessor और सेटर विधियां बनाने के लिए किया जाता है, ताकि हम Object.variable जैसे Object.variable या Object.variable = some_value Object.variable कर Object.variable = some_valueObject.variable = some_value

मैंने पढ़ा है कि attr_accessible बनाता है कि विशिष्ट वैरिएबल बाहर की दुनिया के लिए सुलभ हो। क्या कोई मुझे बता सकता है कि अंतर क्या है

वेब के समाधान से एकत्रित समाधान "Attr_accessor और attr_accessible के बीच का अंतर"

attr_accessor एक रूबी विधि है जो एक गेटर और सेटर बनाती है। attr_accessible एक रेल विधि है जो आपको एक सामूहिक कार्य के लिए मूल्यों में पारित करने की अनुमति देता है: new(attrs) या update_attributes(attrs)

यहां एक सामूहिक कार्य है:

 Order.new({ :type => 'Corn', :quantity => 6 }) 

आप कल्पना कर सकते हैं कि आदेश में छूट कोड भी हो सकता है, कहते हैं: price_off यदि आप टैग नहीं करते हैं: price_off attr_accessible के रूप में आप दुर्भावनापूर्ण कोड को ऐसा करने में सक्षम होने से रोकते हैं:

 Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 }) 

यहां तक ​​कि अगर आपके फॉर्म में इसके लिए फ़ील्ड नहीं है: price_off, अगर यह आपके मॉडल में है तो यह डिफ़ॉल्ट रूप से उपलब्ध है। इसका मतलब है कि एक तैयार की गई पोस्ट अभी भी इसे सेट कर सकती है। Attr_accessible सफेद का उपयोग उन चीजों को सूचीबद्ध करता है जो बड़े पैमाने पर असाइन किए जा सकते हैं।

इस धागे और Google पर बहुत से लोग बहुत अच्छी तरह से समझाते हैं कि attr_accessible उन विशेषताओं के श्वेतसूची को निर्दिष्ट करता है जिन्हें बल्क में अपडेट करने की अनुमति दी जाती है ( एक साथ ऑब्जेक्ट मॉडल के सभी गुण एक साथ मिलते हैं ) यह मुख्य रूप से (और केवल) आपकी रक्षा के लिए है "मास असाइनमेंट" समुद्री डाकू का उपयोग करने के लिए आवेदन

यह आधिकारिक रेल डॉक्टरों पर समझाया गया है: मास असाइनमेंट

attr_accessor एक रूबी कोड है (जल्दी से) एक कक्षा में सेटर और गेटर विधियां बनाते हैं। बस इतना ही।

अब, जो स्पष्टीकरण के रूप में गायब है वह है कि जब आप किसी डेटाबेस तालिका के साथ किसी रेलवे मॉडल के बीच एक लिंक बनाते हैं, तो कभी भी, कभी भी अपने मॉडल में attr_accessor आवश्यकता नहीं होती है, आपके टेबल के रिकॉर्ड

यह इसलिए है क्योंकि आपका मॉडल ActiveRecord::Base क्लास से सभी तरीकों को प्राप्त करता है, जो आपके लिए पहले से ही मूल CRUD एक्सेसर्स (बनाएँ, पढ़ें, अपडेट, हटाएं) को परिभाषित करता है इसे आधिकारिक डॉक्टर पर समझाया गया है रेल मॉडल और यहाँ पर अधोरेखण करना डिफ़ॉल्ट एक्सेसर (अध्याय "डिफ़ॉल्ट एक्सेसर ओवरराइट करें" पर स्क्रॉल करें)

उदाहरण के लिए कहें कि: हमारे पास "उपयोगकर्ता" नामक डेटाबेस तालिका है जिसमें तीन स्तंभ "प्रथमनाम", "अंतिम नाम" और "भूमिका" है:

एसक्यूएल निर्देश:

 CREATE TABLE users ( firstname string, lastname string role string ); 

मैंने मान लिया है कि आप अपने कॉन्फिग / पर्यावरण / उत्पादन। config.active_record.whitelist_attributes = true में मास असाइनमेंट से अपने अनुप्रयोग की सुरक्षा के लिए विकल्प config.active_record.whitelist_attributes = true सेट करते हैं। इसे यहाँ समझाया गया है: बड़े पैमाने पर असाइनमेंट

आपका रेल मॉडल पूरी तरह से नीचे मॉडल के साथ काम करेगा:

 class User < ActiveRecord::Base end 

हालांकि आपको अपने नियंत्रक में अलग-अलग उपयोगकर्ता के प्रत्येक एट्रिब्यूट को अपने फार्म के काम के लिए अद्यतन करने की आवश्यकता होगी:

 def update @user = User.find_by_id(params[:id]) @user.firstname = params[:user][:firstname] @user.lastname = params[:user][:lastname] if @user.save # Use of I18 internationalization t method for the flash message flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human) end respond_with(@user) end 

अब अपने जीवन को कम करने के लिए, आप अपने यूजर मॉडल के लिए एक जटिल नियंत्रक नहीं बनाना चाहते हैं। तो आप अपने क्लास मॉडल में attr_accessible विशेष विधि का प्रयोग करेंगे:

 class User < ActiveRecord::Base attr_accessible :firstname, :lastname end 

तो आप अपडेट करने के लिए "राजमार्ग" (सामूहिक असाइनमेंट) का उपयोग कर सकते हैं:

 def update @user = User.find_by_id(params[:id]) if @user.update_attributes(params[:user]) # Use of I18 internationlization t method for the flash message flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human) end respond_with(@user) end 

आपने attr_accessible सूची में "भूमिका" विशेषताओं को नहीं जोड़ा है, क्योंकि आप अपने उपयोगकर्ताओं को अपनी भूमिका स्वयं (वैसे ही व्यवस्थापक) द्वारा निर्धारित नहीं करते हैं। आप अपने आप को एक और विशेष व्यवस्थापक देखें पर देखें।

हालांकि आपका उपयोगकर्ता दृश्य "भूमिका" फ़ील्ड नहीं दिखाता है, एक समुद्री डाकू आसानी से एक HTTP पोस्ट अनुरोध भेज सकता है जिसमें पैरामीटर हैश में "भूमिका" शामिल है। attr_accessible पर अनुपलब्ध "भूमिका" विशेषता आपके आवेदन को उस से सुरक्षित करना है

आप अभी भी अपने user.role विशेषता को नीचे की तरह बदल सकते हैं, लेकिन सभी विशेषताओं के साथ नहीं।

 @user.role = DEFAULT_ROLE 

आप attr_accessor उपयोग क्यों करेंगे?

ठीक है, यह उस स्थिति में होगा, जो आपके उपयोगकर्ता-प्रपत्र एक ऐसा क्षेत्र दिखाता है जो आपके उपयोगकर्ता तालिका में स्तंभ के रूप में मौजूद नहीं है।

उदाहरण के लिए, कहें कि आपका उपयोगकर्ता दृश्य एक "कृपया-बता-द-प्रशासन-कि-मैं-इन-यहां-" फ़ील्ड दिखाता है। आप इस तालिका को अपनी तालिका में संग्रहीत नहीं करना चाहते हैं। आप चाहते हैं कि रेल आपको एक ई-मेल चेतावनी भेजता है कि एक "पागल" 😉 उपयोगकर्ता ने सदस्यता ली है

इस जानकारी का उपयोग करने में सक्षम होने के लिए आपको इसे अस्थायी रूप से कहीं और संग्रहीत करने की आवश्यकता है। एक user.peekaboo में इसे पुनर्प्राप्त करने में अधिक आसान क्या है। user.peekaboo विशेषता?

तो आप इस मॉडल को अपने मॉडल में जोड़ते हैं:

 class User < ActiveRecord::Base attr_accessible :firstname, :lastname attr_accessor :peekaboo end 

तो आप उपयोगकर्ता के शिक्षित उपयोग करने में सक्षम होंगे। कहीं भी आपके नियंत्रक में कोई ई-मेल भेजने या जो भी आप चाहते हैं, करते हैं।

ActiveRecord आपकी तालिका में "peekaboo" विशेषता को सहेज नहीं पाएंगे, जब आप user.save क्योंकि उसे इस मॉडल से उसके मॉडल में मेल खाने वाला कोई कॉलम दिखाई नहीं देता है

attr_accessor एक रूबी विधि है जो आपको एक ही नाम के एक आवृत्ति चर में सेटर और गेटर विधियां प्रदान करता है। तो यह बराबर है

 class MyModel def my_variable @my_variable end def my_variable=(value) @my_variable = value end end 

attr_accessible एक रेल विधि है जो निर्धारित करता है कि कौन सा चर एक सामूहिक असाइनमेंट में सेट किया जा सकता है।

जब आप एक फ़ॉर्म सबमिट करते हैं, और आपके पास कुछ है तो MyModel.new params[:my_model] तो आप थोड़ा अधिक नियंत्रण चाहते हैं, ताकि लोग उन चीजों को जमा न कर सकें जिन्हें आप नहीं चाहते।

आप attr_accessible :email कर सकते हैं attr_accessible :email ताकि जब कोई अपना खाता अपडेट करे, तो वे अपना ईमेल पता बदल सकते हैं। लेकिन आप attr_accessible :email, :salary नहीं करेंगे attr_accessible :email, :salary क्योंकि तब एक व्यक्ति एक फॉर्म सबमिशन के माध्यम से अपना वेतन निर्धारित कर सकता है। दूसरे शब्दों में, वे एक बढ़ाव के लिए अपने तरीके से हैक कर सकते हैं।

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

तो attr_accessor चर को स्टोर करने के तरीकों को बनाने के बारे में है, और attr_accessible जन असाइनमेंट की सुरक्षा के बारे में है।

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

चलिए निम्नलिखित उदाहरण पर विचार करें

 class Address attr_reader :street attr_writer :street def initialize @street = "" end end 

यहां हमने attr_writer ( पठनीय विशेषता ) और attr_writer ( लिखने योग्य विशेषता ) का इस्तेमाल किया है। लेकिन हम attr_accessor का उपयोग करते हुए एक ही कार्यक्षमता प्राप्त कर सकते हैं। संक्षेप में, attr_accessor दोनों प्राप्तकर्ता और सेटर विधियों तक पहुंच प्रदान करता है।

तो संशोधित कोड नीचे है

 class Address attr_accessor :street def initialize @street = "" end end 

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

दो शब्दों में:

attr_accessor है, setter विधि जबकि attr_accessible कहने के लिए है कि विशेष विशेषता सुलभ है या नहीं बस।


मैं जोड़ना चाहता हूं कि हमें बड़े पैमाने पर attr_accessible से बचाने के लिए attr_accessible बजाय सशक्त पैरामीटर का उपयोग करना चाहिए।

चीयर्स!

एक त्वरित और संक्षिप्त अंतर अवलोकन:

attr_accessor एक आसान तरीका है अपनी कक्षा में attr_accessor को पढ़ने और लिखने के लिए। इसका उपयोग तब किया जाता है जब आपके पास अपने डेटाबेस में कोई स्तंभ नहीं होता है, लेकिन फिर भी अपने फ़ॉर्म में एक फ़ील्ड दिखाना चाहते हैं यह फ़ील्ड रेल मॉडल में एक “virtual attribute” है।

वर्चुअल विशेषता – डाटाबेस में किसी स्तंभ के अनुरूप नहीं एक विशेषता

attr_accessible विशेषताओं को पहचानने के लिए प्रयोग किया जाता है जो आपके नियंत्रक विधियों से सुलभ हैं, सामूहिक-असाइनमेंट के लिए उपलब्ध संपत्ति बनाते हैं .. यह केवल आपके द्वारा निर्दिष्ट विशेषताओं तक पहुंच की अनुमति देगा, शेष को नकार देगा।