2009-07-14 17 views
17

प्रस्तुत करना मैं एक वेब साइट को दो वर्गों में विभाजित करने की कोशिश कर रहा हूं। एक जिसे अनुप्रयोग लेआउट का उपयोग करना चाहिए और एक जिसे व्यवस्थापक लेआउट का उपयोग करना चाहिए। इस प्रकार मेरी application.rb में मैं एक समारोह बनाया:रेल पर रूबी - लेआउट

def admin_layout 
    if current_user.is_able_to('siteadmin') 
    render :layout => 'admin' 
    else 
    render :layout => 'application' 
    end 
end 

और नियंत्रकों में जहां यह एक हो सकता है या अन्य मैं

before_filter :admin_layout 

यह कुछ पृष्ठों के लिए ठीक काम करता है डाल (जहां इसकी सिर्फ पाठ), लेकिन दूसरों के लिए मैं क्लासिक त्रुटि मिलती है:

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

किसी को भी मैं क्या याद कर रहा हूँ की एक विचार है? मुझे रेंडर और लेआउट का सही तरीके से उपयोग कैसे करना चाहिए?

उत्तर

38

विधि render वास्तव में सामग्री प्रस्तुत करने का प्रयास करेगा; आपको इसे कॉल नहीं करना चाहिए जब आप बस इतना करना चाहते हैं कि लेआउट सेट करें।

रेल इस में पकाया के सभी के लिए एक पैटर्न है, बस बुलाया जाएगा layout करने के लिए एक प्रतीक है और उस नाम के साथ विधि पारित आदेश वर्तमान लेआउट निर्धारित करने के लिए:।

class MyController < ApplicationController 
    layout :admin_layout 

    private 

    def admin_layout 
    # Check if logged in, because current_user could be nil. 
    if logged_in? and current_user.is_able_to('siteadmin') 
     "admin" 
    else 
     "application" 
    end 
    end 
end 

See details here

+1

हालांकि जब तक कथन अनावश्यक नहीं है? और current_user.is_able_to ('siteadmin') वर्तमान_user के रूप में लॉग इन नहीं होने पर शून्य हो सकता है! –

+0

@ रेबेन, यह एक अच्छा मुद्दा है; जोड़ा। – molf

+0

मेरे पास उस लाइन से पहले अन्य चेक हैं, यह जांचने के लिए कि कोई उपयोगकर्ता लॉग इन है या नहीं। यह आश्चर्यजनक है, मैंने कभी भी लेआउट के बाद फ़ंक्शन को कॉल करने के बारे में सोचा नहीं। इतना आसान और बहुत उपयोगी। धन्यवाद। – RyanJM

5

शायद आपको यह जांचने की ज़रूरत है कि उपयोगकर्ता पहले साइन इन है?

def admin_layout 
    if current_user and current_user.is_able_to 'siteadmin' 
    render :layout => 'admin' 
    else 
    render :layout => 'application' 
    end 
end 
+0

.nil? जब तक log_in अगर – Gav

1

ऐसा इसलिए हो सकता है क्योंकि current_usernil है जब उपयोगकर्ता लॉग इन नहीं है। या तो .nil? के लिए परीक्षण या ऑब्जेक्ट प्रारंभ करें। साथ

0

कोशिश Molf का जवाब:

logged_in तो क्या होगा? और current_user.is_able_to ('siteadmin')

0

आपका वर्तमान उपयोगकर्ता properbly उपयोगकर्ता के बाद में सेट किया गया है में लॉग इन किया है। और इस मामले में आप तय करें कि आप

तरह

में लॉग इन किया एक विकल्प होना चाहिए

if [email protected]_user.nil? 
    if @current_user.is_able_to("###") 
    render :layout => "admin" 
    else 
    render :layout => "application" 
    end 
end 

फिर यह केवल अगर कथन में आपका @current_user नहीं है तो यह केवल कथन दर्ज करेगा।

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