2010-11-10 10 views
53

मैं हाल ही में एक रेल आवेदन पर वसीयत स्थापित किया है, और अगर यह संभव हो सकता है की वर्तमान में अन्य मॉडलों या नियंत्रकों के किसी एक में उपयोगकर्ता के प्रवेश एक उदाहरण पाने के लिए मैं सोच रहा हूँ, और यदि हां, तो मुझे लगता है कि कैसे करते हो ?रेल डिवाइसेस: वर्तमान में लॉग इन उपयोगकर्ता का ऑब्जेक्ट प्राप्त करें?

उत्तर

112

वसीयत मक्खी है कि आपके वर्तमान में लॉग उपयोगकर्ता प्रतिनिधित्व करते हैं पर सुविधा तरीकों पैदा करता है।

हालांकि आपको ध्यान रखना चाहिए कि जेनरेट किए गए विधि नाम में आपके उपयोगकर्ता मॉडल का वर्ग नाम शामिल है। जैसे यदि आपके डेविस मॉडल को 'User' कहा जाता है तो वर्तमान में लॉग इन उपयोगकर्ता को 'current_user' के साथ एक्सेस किया जा सकता है, और यदि आपकी डेविस क्लास 'Admin' है तो लॉग इन व्यवस्थापक उपयोगकर्ता को 'current_admin' से एक्सेस किया जा सकता है।

इसी तरह के सम्मेलनों के साथ बनाई गई कई अन्य विधियां हैं, उदाहरण के लिए 'user_signed_in?' या फिर 'admin_signed_in?', जो वास्तव में अच्छे हैं। तो आप हो सकता है

इन विधियों नियंत्रकों और विचारों में उपलब्ध हैं एक दृश्य में निम्नलिखित:

<% if user_signed_in? %> 
    <div>Signed in as... <%= current_user.email %></div> 
<% end %> 

अंत में, आप दो का उपयोग कर रहे या एक से अधिक अपने अनुप्रयोग में मॉडल (जैसे उपयोगकर्ता और व्यवस्थापक) वसीयत है, आप जांच करने के लिए 'anybody_signed_in? की सुविधा के विधि का उपयोग कर सकते हैं अगर उपयोगकर्ता के उन प्रकार के दोनों प्रवेश किया है:

<% if anybody_signed_in? %> 
    <h2>Special offers</h2> 
    <p>All registered users will receive free monkeys!</p> 
<% end %> 

अद्यतन:

वसीयत संस्करण 1.2.0 के बाद से, 'anybody_signed_in?' पदावनत किया गया है और 'signed_in?'

+1

सबकुछ स्कॉट कहता है सही है, लेकिन यह भी (और यह भी नया हो सकता है) डेविस कॉल 'यूजर' और 'एडमिन' यहां कॉल करता है " स्कोप "। यदि आप दस्तावेज़ में उस शब्द को देखते हैं, तो यही वह बात है जिसका संदर्भ है। – Peeja

+0

लेकिन अनुरोध ऑब्जेक्ट में यह जानकारी कहां है? – mehulkar

1

विधि कॉल :) के लिए एक पैरामीटर के रूप में यह दर्रा में।

एक विचार एक before_filter रूप Thread.current[:current_user] = @current_user उपयोग करने के लिए है - लेकिन आप पतला + EM_Mysql2 + तरह एक तैनाती ढेर उपयोग कर रहे हैं रैक :: FiberPool, आप Fiber.current[:current_user] है कि सेट करना होगा।

उन समाधान वास्तव में सिर्फ अच्छे डिजाइन तर्क की कमी के लिए ऊपर कवर कर रहे हैं।

+0

व्यक्तिगत तौर पर मैं धागा ऑबजेक्ट पर प्रासंगिक मूल्यों चिपके हुए एक "गंध" मानते हैं। आप स्वीकार करते हैं कि आखिरी पंक्ति में, कुडोस, लेकिन मैं बस उस पर जोर देना चाहता हूं ... – jaydel

15

द्वारा बदल दिया वसीयत सहायक तरीकों नियंत्रक और दृश्य परतों में ही उपलब्ध हैं। वे मॉडल परत पर उपलब्ध नहीं हैं (README के नियंत्रक फ़िल्टर और सहायक अनुभाग देखें)।

  • Is it possible to get the currently logged in user from within a model?

डेविस आपके लिए बनाता है कि डिफ़ॉल्ट सहायक तरीकों के माध्यम से यह संभव नहीं है। हालांकि, मॉडल के लिए current_user प्रदान करने के लिए आप कई वैकल्पिक विधियों का उपयोग कर सकते हैं। एलेक्स बार्टलो द्वारा सबसे आसान तरीका सुझाया गया है, और यह आपके मॉडल के लिए विधि के माध्यम से current_user को पास करना है।

  • Is it possible to get the currently logged in user from within a controllers?

हाँ, यह संभव है। current_<modelname> का उपयोग करें, जहां <modelname> मॉडल का नाम है जिसमें डेविस प्रमाणीकरण क्षमताएं हैं (यानी, rails g devise <modelname> के माध्यम से)।यदि, उदाहरण के लिए, आपका मॉडल User है, तो आप current_user का उपयोग करेंगे। यदि आपका मॉडल Elmo है, तो आप current_elmo का उपयोग करेंगे।

1

सरल विधि है:

if @suit.user == current_user 

उदाहरण:

= link_to "Back", root_path, class: "btn btn-default" 

    -if @suit.user == current_user 

    = link_to "Edit", edit_suit_path, class: "btn btn-default" 

    = link_to "Delete", suit_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default" 
संबंधित मुद्दे

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