2012-12-15 7 views
6

मेरी User मॉडल में, मैं इस किया है।मैं कुछ विशेषताओं को केवल उन उपयोगकर्ताओं के लिए सुलभ कैसे बना सकता हूं जिनके पास विशिष्ट भूमिका है?</p> <pre><code>attr_accessible :role_ids, :as => :admin </code></pre> <p>लेकिन वह काम करने के लिए प्रतीत नहीं होता:

मैं चाहता हूं कि यह विशेष विशेषता केवल तभी पहुंच योग्य हो जब current_user.can?(:edit, Role) - यानी admin या superadmin की भूमिका वाले उपयोगकर्ता केवल उन गुणों तक पहुंचने में सक्षम होना चाहिए।

मैं यह कैसे कर सकता हूं?

संपादित करें 1: मैं डेविस, कैनकन & रोलिफ़ाई का उपयोग कर रहा हूं।

+0

डाउनवोट और करीबी वोट के साथ क्या है? एक स्पष्टीकरण की पेशकश करने की देखभाल? – marcamillion

+2

आपने क्या इंस्टॉल किया है? क्या आप कैनकन और तैयार कर रहे हैं? डाउनवोट शायद जानकारी की कमी है। – simonmorley

+0

@ सिमोनमोर्ली हां, कैनकन और डेविस। क्षमा करें, प्रश्न अपडेट करेंगे। – marcamillion

उत्तर

9

जैसा कि मैंने कहा, हमें लगता है कि कुछ भूमिकाओं के लिए विशेषताओं को प्रतिबंधित करने का सबसे अच्छा तरीका strong parameters मणि का उपयोग करना है जिसे डीएचएच ने हाल ही में पेश किया था। यह रेलवे 4 का भी हिस्सा होगा।

भले ही यह फिट न हो, फिर भी सिद्धांतों को एकीकृत करना एक अच्छा विचार है क्योंकि यह आपके रेल 3 से 4 अपग्रेड को आसान बना देगा।

यदि आपके पास रेलसैक्स प्रो सदस्यता है, तो रायन बेट्स ने fantastic tutorial पर एक और बना दिया है।

संक्षेप में, रेलवेकास्ट में इसकी क्या सिफारिश की गई है।

मणि स्थापित करने के बाद, अपने मॉडल से attr_accessible हटा दें।

एक प्रारंभकर्ता को यह करें:

:

ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection) 

अपने नियंत्रक ::

def update 
    @topic = Topic.find(params[:id]) 
    if @topic.update_attributes(topic_params) 
    redirect_to topics_url, notice: "Updated topic." 
    else 
    render :edit 
    end 
end 

अपने नियंत्रक में एक निजी पद्धति बनाएं में अपने अद्यतन कार्रवाई में परिवर्तन

def topic_params if current_user && current_user.admin? params[:topic].permit(:name, :sticky) else params[:topic].permit(:name) end end 

आपकी स्थिति में, जैसे हम करते हैं, आपको अपनी भूमिकाओं का उपयोग करने के लिए topic_params विधि को बदलना होगा।

रेलस्कास्ट में कुछ और सुझाव हैं और यह वास्तव में $ 9 के लायक है! (मैं साइट से संबद्ध नहीं हूं, यह सिर्फ हमारे लिए अमूल्य साबित हुआ है)

अगर यह मदद करता है तो मुझे बताएं।

+0

इसके लिए आपको बहुत बहुत धन्यवाद। ऐसा लगता है कि मुझे क्या चाहिए। मैं वास्तव में रेलस्कास्ट के समर्थक संस्करण को प्राप्त करने के लिए बाहर रहा था - लेकिन मैंने हाल ही में एक सदस्यता खरीदी है और यह बहुत उपयोगी साबित हुआ है। बस 'strong_parameters' मणि दोनों का त्वरित अवलोकन कर रहे हैं, और यह रेलस्कास्ट ऐसा लगता है कि मुझे इसकी आवश्यकता है। – marcamillion

+0

यह शुरुआत में अधिक काम है जो आपने शायद आशा की थी लेकिन लंबे समय तक इसके लायक है। सौभाग्य। एस – simonmorley

+0

हां, यही वह था जो मैं सोच रहा था .... ओई veeyy .... यह सिरदर्द की तरह दिखता है। लेकिन, मेरे पास कोई विकल्प नहीं है - और रेलस्कास्ट की उपलब्धता इसे प्रबंधित करना बहुत आसान बनाती है। – marcamillion

0
मेरे उपयोगकर्ता मॉडल में

class User 
    attr_accessible :nickname, as: :admin 
end 

मेरी रेल कंसोल में

User.first.update_attributes!({nickname: "uschi"}) 
# WARNING: Can't mass-assign protected attributes: nickname 

User.first.update_attributes!({nickname: "uschi"}, {as: :admin}) 
# true 

अद्यतन

शायद मैं बेवकूफ हूं आपकी समस्या को प्राप्त करने के लिए, लेकिन सिर्फ एक

if current_user.can?(:edit, Role) 
    user.update_attributes!({nickname: "uschi"}, {as: :admin}) 
else 
    first.update_attributes!({nickname: "uschi"}) 
end 
करना

और वहां पी हैं ऐसा करने के शानदार तरीके ...

+0

मुझे कैनकन और रोलिफ़ाई के लिए - मेरी 'क्षमता' मॉडल में निर्दिष्ट भूमिकाओं के साथ काम करने की आवश्यकता है। ': As =>: admin' के साथ यह नहीं है। – marcamillion

+0

हाँ, यह कैनकन के साथ सही नहीं है क्योंकि ऐसा लगता है कि आप व्यवस्थापक के लिए एक बूलियन मान बना रहे हैं। – simonmorley

+0

ये ... @simonmorley स्पॉट-ऑन है। मैं कैनकन और रोलिफ़ाई का उपयोग कर मॉडल पर कुछ विशेषताओं तक पहुंच प्रतिबंधित करने की कोशिश कर रहा हूं। आपने जो कुछ सुझाव दिया है वह कुछ है जो आप नियंत्रक या किसी दृश्य या कुछ में करेंगे। मुझे इसे अपने मॉडल में करने की ज़रूरत है। – marcamillion

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

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