2010-12-04 5 views
14

मैं एप्लिकेशन लेआउट में बबल करने के लिए एप्लिकेशन नियंत्रक में एक चर सेट सेट करने का प्रयास कर रहा हूं।रेल: मेरे एप्लिकेशन लेआउट में एक एप्लाकेशन कंट्रोलर वैरिएबल कैसे प्राप्त करें

अगर मैं का उपयोग करें:

@var = 'foo' 

... आवेदन लेआउट पता नहीं है कि मैं क्या बात कर रहा हूँ के बारे में

अगर मैं एक वैश्विक चर

$var = 'foo' 

का उपयोग .. आवेदन लेआउट काम करता है। हालांकि, मेरे कार्यात्मक परीक्षण काम नहीं करते:

# application layout 
# my var is an AR object 
$var.name 

# Stock functional test 
class HomeControllerTest < ActionController::TestCase 
    test "should get index" do 
    get :index 
    assert_response :success 
    end 
end 

# test:functionals 
ActionView::Template::Error: undefined method `name' for nil:NilClass 

मुझे एप्लिकेशन लेआउट (प्रत्येक पृष्ठ) के लिए यह var उपलब्ध है। विचार? क्या मुझे इसे एक सत्र var बनाने की ज़रूरत है?

अद्यतन

कुछ अन्य पदों मैं पढ़ रहा हूँ के आधार पर यह आवेदन सहायक में इन जगह, फिर उन्हें लेआउट से फोन सबसे अच्छा अभ्यास माना जाता है?

# Application helper 
def get_var 
    Product.first 
end 

# Application layout 
<% @var = get_var %> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
... 

यह ए) मेरे ब्राउज़र में काम करता है और बी) परीक्षण पास करता है। क्या यह सबसे अच्छा अभ्यास है? क्या कोई आसान/बेहतर तरीका है?

उत्तर

19

क्या आपने विधि को पहले से सेट करने का प्रयास किया था जहां चर को यह सुनिश्चित करने के लिए घोषित किया गया है कि एक दूसरे नियंत्रक इसे कॉल करता है और चर को उनके संबंधित दृश्य में पास करता है? एक foo_function

डीईएफ़ foo_function
@var = "foo"
अंत

अंत

तो @var है:

वर्ग ApplicationController < ActionController :: बेस

before_filter एआर ऑब्जेक्ट और स्ट्रिंग नहीं, आपको यकीन है कि आपके पास मॉडल नाम और कॉलम नाम सही ढंग से परिभाषित है?

+0

चर पहले/filter w/o सेट किए जा रहे हैं। वास्तव में, यदि मैं उन्हें वैश्विक वर्र्स के रूप में सेट करता हूं तो एप्लिकेशन लेआउट उन्हें देख सकता है। लेकिन ए) मैं ग्लोबल्स से बचने की कोशिश कर रहा हूं और बी) मेरे बुनियादी कार्यात्मक परीक्षणों के बारे में कोई जानकारी नहीं है (कुछ अजीब कारणों से) – jmccartie

1

क्या आपने इसे helper_method के रूप में लागू करने का प्रयास किया है?

class ApplicationController < ActionController::Base 
    helper_method :foo, :foo= 

    def foo 
    @var ||= "foo" 
    end 

    def foo=(val) 
    @var = val 
    end 
end 
+0

एप्लिकेशन सहायक में उन्हें रखने का क्या फायदा है? मुझे पता है कि ऐसा करके, इसे कहीं से भी बुलाया जा सकता है, लेकिन इस मामले में, मुझे इसके लिए आवेदन लेआउट – jmccartie

+0

पर उपलब्ध होना आवश्यक है यदि आपको वास्तव में केवल लेआउट फ़ाइल में इसकी आवश्यकता है, तो दोनों ठीक हैं। यह विधि की प्रकृति पर निर्भर करता है, लेकिन यह एक बड़ा सौदा नहीं है जब तक कि आपके पास एक जटिल जटिल परियोजना न हो। व्यक्तिगत रूप से मैं आवेदन नियंत्रक में आउटपुट स्वरूपण विधियों और उनके आश्रित तरीकों को लागू करता हूं, जबकि दूसरों को एप्लिकेशन नियंत्रक में रखते हुए। – PeterWong

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