2015-09-08 6 views
6

का उपयोग कर वर्तमान उपयोगकर्ता के लिए उपयोगकर्ता आईडी प्राप्त करें इसलिए मैं, एक रेल नौसिखिया, वर्तमान में वर्तमान डिवाइस सत्र से उपयोगकर्ता आईडी प्राप्त करने का प्रयास कर रहा हूं, और मुझे कुछ परेशानी हो रही है।डेविस/रेल

अब मैं अपने नियंत्रक में इस है:

def index 
    @currentUser = current_user.id 
end 

और मैं एक सरल बनाने के लिए अगर बयान क्षेत्रों मेरी रूप में/छिपाने दिखाना चाहते हैं।

<% if @currentUser === @product.user_id %> 
      <%= link_to "Back", products_path %> 
      <%= link_to "Edit", edit_product_path(@product) %> 
      <%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?"} %> 
     <% else %> 
      <span></span> 
<% end %> 

मैं परिभाषित करने मेरी currentUser चर बुरा है में एक महसूस कर रही मेरी वाक्य रचना है, लेकिन मैं कैसे इसे ठीक करने के लिए कोई विचार है। स्टैक पर कुछ समान प्रश्न थे, लेकिन उनमें से कोई भी वास्तव में मेरे लिए लागू नहीं हुआ या मेरी मदद की।

अग्रिम धन्यवाद!

उत्तर

7

मैं यहाँ

def index 
    @currentUser = current_user.id 
end 

अन्य की तुलना में क्या @HolyMoly पहले से ही टिप्पणी की, आप, अंडरस्कोर और नहीं CamelCase का उपयोग करना चाहिए अगर current_user यहां नहीं के बराबर, .id उस पर विफल हो जाएगा, एक अपवाद है, जिसके परिणामस्वरूप है कुछ समस्याओं को देखते हैं।

दूसरे, आप "क्षमता" की जाँच कर रहे आईडी के मूल्यों की तुलना द्वारा, मैं अपने कोड एक सहायक

def allow_product_delete?(product) 
    return false unless current_user 
    @product.user_id == current_user.id 
end 

में इस

<% if allow_product_delete?(@product) %> 

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

यदि कोई उपयोगकर्ता लॉग इन नहीं है, तो current_user शून्य होगा, आपको हमेशा इसके लिए तैयार रहना होगा और इसके खिलाफ सुरक्षा करना होगा।

आखिरकार, मैं क्षमता रत्न (कैनकन या कैनकनन) में देखता हूं, जो आप यहां कोशिश कर रहे थे उससे निपटने के लिए एक बहुत अच्छा डीएसएल प्रदान करते हैं।

2

सबसे पहले, undescored_rather_than ऊंट की तरह रूबी आधारित शैली।

दूसरा, आपको तीन की बजाय दो बराबर संकेतों की आवश्यकता है।

<% if current_user == @product.user %> 
    <%= link_to "Back", products_path %> 
    <%= link_to "Edit", edit_product_path(@product) %> 
    <%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?"} %> 
<% end %> 

कृपया ध्यान दें कि मैं current_user विधि में @ छोड़ा जाता है, क्योंकि current_user है: @currentUser == @product.user_id

तीसरे पर काम करना चाहिए, आप पूर्णांक आईडी तुलना करने के लिए, आप मॉडल की तुलना कर सकते हैं, ऐसा ही कुछ की जरूरत नहीं है तैयार करने के लिए सहायक, अन्यथा मैंने अनावश्यक <% else %> (मेरी राय में)

+0

तेजी से उत्तर के लिए धन्यवाद। मैंने इसे आजमाया, लेकिन यह काम नहीं कर सका, इसलिए मैं देखना चाहता था कि वास्तव में क्या तुलना की जा रही है, और '<% = current_user%>' मुद्रित किया गया है, और '# <उपयोगकर्ता: 0x00000006e5e2e0>' मिला। क्या यह पूर्णांक आईडी के बजाय मॉडलों की तुलना करने के बारे में आपने जो कहा है उसके साथ क्या करना है? – aishaq11

+0

@ aishaq11 यह सामान्य स्थिति है - यह 'अद्वितीय' वर्ग का प्रतिनिधित्व करता है जिसमें इसकी अद्वितीय आईडी है। एक ही प्रतिपादन पर '<% = current_user.id%>' और '<% = product.user_id%>' जैसी कुछ कोशिश करें। क्या आईडी समान मानता है? – asiniy

2

क्या आपने इसे वास्तव में current_user उपयोगकर्ता में सक्षम करने के लिए सेट अप किया है? अपने कोड में आपके पास:

@currentUser = current_user.id

लेकिन जहां current_user परिभाषित किया गया था? तो

def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
    end 

: मैं वसीयत का इस्तेमाल किया है, लेकिन सत्र के साथ आप एक सहायक विधि के साथ current_user का मूल्य निर्धारित कर सकते हैं (आप भी sessions_controller #create विधि में उसे वहीं ऐसा करने में सक्षम हो सकता है), इस तरह अपने पूरे ऐप में आप current_user.id या current_user.name या जो भी आपको चाहिए, का उपयोग कर सकते हैं।

इसलिए सत्र सत्र नहीं है, मुझे उम्मीद है कि इससे मदद मिलती है।

1

आपको इसके लिए current_user का उपयोग करना चाहिए। आप इसे परियोजना में हर जगह कर सकते हैं। कोई चर @currentUser या आदि को परिभाषित करने की जरूरत है

आप मॉडल

if current_user == @product.user 

if current_user.id == @product.user.id 

कुछ मामलों में के बराबर है इस तरह की तुलना कर सकते हैं जिनका उपयोग आप

if current_user.id == @product.user_id 

यह उपयोगकर्ता मॉडल

लोड करने के लिए अतिरिक्त sql क्वेरी को रोकता है

आप प्राधिकरण के लिए वसीयत उपयोग कर रहे हैं और आप कार्यों के लिए उपयोग कर सकते आप देखना चाहिए (शायद का उपयोग करें) मणि https://github.com/CanCanCommunity/cancancan

https://github.com/airbnb/ruby आप धुन में रहने के लिए मदद मिलेगी पर नियंत्रण की जरूरत है;)

0

तुलना आईडी रेल के लिए सबसे अच्छा अभ्यास नहीं है। यदि आपने पहले एसोसिएशन को सही तरीके से स्थापित किया है, तो आपको आईडी के बीच तुलना करने की आवश्यकता नहीं है। उदाहरण के लिए:

User 
has_many :group_events 

GroupEvent 
belongs_to :user 

इस परिदृश्य में, बजाय आईडी की तुलना में, आप सीधे संघ के साथ तुलना कर सकते हैं:

Bad 
@group_event.user_id == current_user.id 

Good 
@group_event.user == current_user