11

द्वारा संरक्षित विशेषताओं को अद्यतन करने के लिए व्यवस्थापक attr_accessible in the Rails 3.1 API पढ़ने के बाद, मुझे लगता है कि वहां :admin विकल्प है। मैं दो चीजें जानना चाहूंगा।रेल का उपयोग 3.1: as =>: attr_accessible

  1. यदि उपयोगकर्ता के पास एक व्यवस्थापक ध्वज है, तो मेरा नियंत्रक मेरे मॉडल को कैसे बताता है कि उपयोगकर्ता एक व्यवस्थापक है।

  2. यदि उपयोगकर्ता एक मालिक है, तो क्या मैं अपने मॉडल में :as => owner निर्दिष्ट कर सकता हूं, और एक बार फिर मेरा नियंत्रक मेरे मॉडल को कैसे सूचित करता है, वे एक आइटम के स्वामी हैं।

उत्तर

18

मॉडल के साथ कोई अंतर्निहित एकीकरण नहीं है; :default को

@project.assign_attributes(params[:project], :as => :admin) 

:as पैरामीटर चूक, और आप किसी भी प्रतीक है कि आप चाहते हैं में पारित कर सकते हैं: आप assign_attributes कॉल में भूमिका में गुजरती हैं। अपने User मॉडल में इस एकीकृत करने के लिए, आप इसे एक विशेषता role बुलाया दे सकता है, और फिर कुछ ऐसा कार्य करें:

@project.assign_attributes(params[:project], :as => current_user.role.to_sym) 

तुम भी सुरक्षा :without_protection का उपयोग कर बायपास कर सकते हैं:

@project.assign_attributes(params[:project], :without_protection => true) 

इसी प्रकार , new, create, create!, update_attributes, और update_attributes! सभी सम्मान सामूहिक असाइनमेंट सुरक्षा विधियों। Ruby on Rails guide on security में more info है।

+0

इस्तेमाल किया मैं हालांकि एक प्रश्न है।मैं एक रेल 4 को 5 तक अपग्रेड कर रहा हूं (जो पहले रेल 3 पर था। और मैं कुछ @ @ project.update_attributes (पैराम्स [: प्रोजेक्ट], जैसे => current_user.role.to_sym) पर आया था, लेकिन लेकिन मैं एक त्रुटि प्राप्त करें जो कहती है कि 'update_attributes' केवल एक तर्क स्वीकार करता है। इस कोड के' as:: admin' भाग 'के साथ क्या हुआ? क्या इसे पूरी तरह से निकालना सुरक्षित है? – Emanuel

3

दोनों परिदृश्यों के लिए, आप इसे उसी तरह से पास करेंगे जैसे आप इसे मूल रूप से घोषित करते हैं। उदाहरण के लिए:

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :credit_card, :as => :admin 
end 

आप

user = User.new(:name => "John", :credit_card => "1234123412341234") 

किया है तो फिर तुम नहीं credit_card प्रदान करने में सक्षम हो जाएगा:

user.attributes # {:name => "John", :credit_card => nil} 

हालांकि, अगर आप कहते हैं कि यह हो जाएगा :as => :admin तो यह

user = User.new({:name => "John", :credit_card => "1234123412341234"}, :as => :admin) 
user.attributes # {:name => "John", :credit_card => "1234123412341234"} 
,210

अधिक जानकारी:

http://www.enlightsolutions.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1

1

सभी विशेषताओं आप एक विशिष्ट उपयोगकर्ता के रूप में उपयोग करना चाहते ठीक से परिभाषित किया जाना चाहिए। उदाहरण के लिए:

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :credit_card, :as => :admin 
    end 

इससे मेरे लिए त्रुटि दिखाई गई। लेकिन जब मैं

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :name, :credit_card, :as => :admin 
    end 

करने के लिए इसे modied यह ठीक काम किया जब मैं

@user.update_attributes(params[:user], :as => :admin) 
संबंधित मुद्दे