इस थ्रेड पर और Google पर बहुत से लोग बहुत अच्छी तरह से समझाते attr_accessibleहैं जो उन विशेषताओं के एक श्वेतसूची को निर्दिष्ट करता है जिन्हें बल्क में अपडेट करने की अनुमति है ( एक ही समय में एक ऑब्जेक्ट मॉडल के सभी गुण एक साथ ) यह आपके आवेदन की सुरक्षा के लिए मुख्य रूप से (और केवल) है "मास असाइनमेंट" से समुद्री डाकू का शोषण।
यह यहाँ रेल पटरियों पर समझाया गया है डॉक्टर: मास असाइनमेंट
attr_accessorएक रूबी कोड है (जल्दी से) एक कक्षा में सेटर और गेट्टर तरीके बनाएं। बस इतना ही।
अब, एक स्पष्टीकरण के रूप में जो याद आ रही है वह यह है कि जब आप डेटाबेस तालिका के साथ (रेल) मॉडल के बीच किसी तरह एक लिंक बनाते हैं, तो आपको attr_accessorअपने मॉडल में बसने और प्राप्त करने के लिए अपने मॉडल की आवश्यकता होती है, ताकि आप संशोधित कर सकें। तालिका के रिकॉर्ड।
ऐसा इसलिए है क्योंकि आपका मॉडल ActiveRecord::Baseक्लास से सभी तरीकों को विरासत में लेता है , जो पहले से ही आपके लिए बुनियादी सीआरयूडी एक्सेसर्स (क्रिएट, रीड, अपडेट, डिलीट) को परिभाषित करता है। इसे यहाँ के आधिकारिक दस्तावेज़ पर बताया गया है कि रेल्स मॉडल और यहाँ ओवर राइटिंग डिफॉल्ट एक्सेसर (अध्याय "ऑलराइट डिफॉल्ट एक्सेसर" पर स्क्रॉल करें)
उदाहरण के लिए कहें कि: हमारे पास "उपयोगकर्ता" नामक एक डेटाबेस तालिका है जिसमें तीन कॉलम "Firstname", "lastname" और "भूमिका" शामिल हैं:
SQL निर्देश:
CREATE TABLE users (
firstname string,
lastname string
role string
);
मैंने मान लिया कि आपने config.active_record.whitelist_attributes = trueअपने एप्लिकेशन को मास असाइनमेंट शोषण से बचाने के लिए अपने config / environment / production.rb में विकल्प सेट किया है । यह यहाँ समझाया गया है: मास असाइनमेंट
आपके रेल मॉडल नीचे दिए गए मॉडल के साथ पूरी तरह से काम करेंगे:
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 POST अनुरोध भेज सकता है जिसमें परमेस हैश में "भूमिका" शामिल है। अनुपलब्ध "भूमिका" विशेषता attr_accessibleआपके एप्लिकेशन को उससे बचाने के लिए है।
आप अभी भी नीचे की तरह अपने user.role विशेषता को संशोधित कर सकते हैं, लेकिन सभी विशेषताओं के साथ एक साथ नहीं।
@user.role = DEFAULT_ROLE
आप नरक का उपयोग क्यों करेंगे attr_accessor?
ठीक है, यह इस मामले में होगा कि आपका उपयोगकर्ता-प्रपत्र एक फ़ील्ड दिखाता है जो आपके उपयोगकर्ताओं की तालिका में स्तंभ के रूप में मौजूद नहीं है।
उदाहरण के लिए, मान लें कि आपका उपयोगकर्ता दृश्य "कृपया-बताएं-व्यवस्थापक-कि-मैं-मैं-में-यहाँ" फ़ील्ड दिखाता हूं। आप इस जानकारी को अपनी तालिका में संग्रहीत नहीं करना चाहते हैं। आप बस इतना चाहते हैं कि रेल आपको एक ई-मेल चेतावनी भेजती है कि एक "पागल" ;-) उपयोगकर्ता ने सदस्यता ली है।
इस जानकारी का उपयोग करने में सक्षम होने के लिए आपको इसे अस्थायी रूप से कहीं स्टोर करने की आवश्यकता है। एक user.peekabooविशेषता में इसे पुनर्प्राप्त करने से ज्यादा आसान क्या है ?
इसलिए आप इस क्षेत्र को अपने मॉडल में जोड़ें:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
attr_accessor :peekaboo
end
तो आप user.peekabooई-मेल भेजने के लिए या अपने मनचाहे काम को करने के लिए कहीं न कहीं अपने नियंत्रक में विशेषता का एक शिक्षित उपयोग कर पाएंगे ।
जब आप ऐसा करते हैं तो ActiveRecord आपकी तालिका में "picaboo" विशेषता को नहीं बचाएगा, user.saveक्योंकि वह अपने मॉडल में इस नाम से मेल खाते कोई कॉलम नहीं देखती है।
attr_accessorगेट्टर और सेटर विधियों को उत्पन्न करने के लिए उपयोग किया जाता है। कृपया एक बहुत व्यापक स्पष्टीकरण के लिए मेरे पिछले प्रश्न का उत्तर देखेंattr_accessible: stackoverflow.com/questions/2652907/… फिर उसके बाद किसी अन्य विशिष्ट विवरण की आवश्यकता होने पर अपने प्रश्न को अपडेट करें।