2009-12-02 15 views
6

यहाँ में आंशिक प्रतिपादन application.html.erb फ़ाइल में कॉल है:समस्या आवेदन लेआउट (रेल)

<%= render :partial => 'tasks/_new' %> 

यहाँ आंशिक गाया जा रहा है (_new.html.erb):

<% form_for @task do |f| -%> 
    <%= f.text_field :body %> 
    <%= submit_tag "Submit" %> 
<% end -%> 

यहाँ में विधि है ' कार्य 'नियंत्रक:

def new 
    @task = Task.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @task } 
    end 
end 

यहाँ मैं आ रही है त्रुटि संदेश है:

Missing template tasks/__new.erb in view path app/views 

और यह कहते हैं त्रुटि इस पंक्ति में है:

<%= link_to "tasks", tasks_path %> <%= render :partial => 'tasks/_new' %> 

फ़ाइल सही निर्देशिका में है। अजीब चीज यह है कि त्रुटि में फ़ाइल नाम में अतिरिक्त _ है। जब मैं में देने के लिए और __new.erb को नाम बदलने आंशिक, यहाँ त्रुटि मैं प्राप्त होते हैं:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id 

और यह कहते हैं त्रुटि इस पंक्ति में है:

<% form_for @task do |f| -%> 

मैं भी _ में बिना की कोशिश की थी कोड, जैसा कि पेट्रोस ने सुझाव दिया था, लेकिन यह उपरोक्त, Called id for nil… जैसा ही त्रुटि देता है।

क्या चल रहा है?

उत्तर

9

आपको अपने कोड में _ की आवश्यकता नहीं है। यह होना चाहिए: आंशिक पैरामीटर: क्योंकि तुम अंदर _ डाल करने के लिए की जरूरत नहीं है

<%= render :partial => 'tasks/new' %> 

पहले त्रुटि है। रेल इसका ख्याल रखती है। यही कारण है कि आप डबल __ प्राप्त करते हैं क्योंकि रेल आपके लिए एक रखेंगे।

दूसरी त्रुटि आपकी असली समस्या है। त्रुटि से पता चलता है कि @ टास्क शून्य है। यह सच है क्योंकि आंशिक केवल जानता है कि कंटेनर दृश्य क्या जानता है, और उस विशेष पल में आपके विचार ने उचित नियंत्रक से कार्रवाई नहीं कहा है। जैसा कि आप (बेबी डिएगो) पहले ही आपकी टिप्पणियों में से एक में पाया और संकेत दिया है, आपको अपने आंशिक में एक कार्य का उदाहरण बनाना होगा। मुझे नहीं पता कि एक और अधिक सुरुचिपूर्ण समाधान है, लेकिन शायद कोई भविष्य में कुछ बेहतर सुझाव दे सकता है।

में हमें जानकारी देने आंशिक खुद ही पता है कि क्या कंटेनर दृश्य जानता है के लिए MattMcKnight के लिए धन्यवाद।

+0

क्षमा करें, मुझे निर्दिष्ट होना चाहिए था। मैंने भी कोशिश की। यह "शून्य के लिए आईडी कहा जाता है" त्रुटि लौटा दी। मैं ओपी को ठीक करने वाला हूँ। –

+0

क्या आप <% = प्रस्तुत करने का प्रयास कर सकते हैं: आंशिक => 'कार्य/नया', स्थानीय => {: कार्य => @ टास्क}%> ... आपको अपने आंशिक में कार्य में @ टास्क को बदलने या कोड जोड़ने की आवश्यकता हो सकती है आंशिक कर <% @ टास्क = कार्य अगर शीर्ष @task == nil%> – Petros

+0

मैंने उस काम को करने की कोशिश की लेकिन मैं नहीं कर सका। आपने मुझे यह समझने में मदद की कि समस्या यह थी कि 'टास्क' वास्तव में एप्लिकेशन लेआउट तक पहुंचने का कोई उदाहरण नहीं था, क्योंकि यह कार्य नियंत्रक के लिए बाध्य है, इसलिए मैंने "<% form_for task.new do | f | -%>" और " इसने काम कर दिया। लेकिन यह एक हैक की तरह लगता है। क्या यह सही दृष्टिकोण है? –

4

Petros सही ढंग से पहली पहचान मुद्दा आप आंशिक कॉल में अंडरस्कोर जरूरत नहीं है। आंशिक के बारे में जानने के लिए दूसरी बात यह है कि वे नियंत्रक विधि को कॉल नहीं करते हैं, वे सिर्फ दृश्य का संदर्भ देते हैं। इस प्रकार, आपको उस आंशिक उपयोग करने वाली प्रत्येक क्रिया में @ टास्क ऑब्जेक्ट को सेट करने की आवश्यकता है, या केवल आंशिक में Task.new को कॉल करें। जब मेरे पास समान परिस्थितियों में लेआउट में आंशिक होता है, तो मैं आमतौर पर इसे जावास्क्रिप्ट से लोड करता हूं ताकि मैं कार्रवाई को कॉल कर सकूं।फ़ाइल app/views/tasks/_new.html.erb में,

<%= render partial: "tasks/new", locals: { task: @task } %> 

और इस तरह चर का संदर्भ लें::

+0

मैं इसे एप्लिकेशन लेआउट से कॉल कर रहा हूं, आंशिक का उपयोग करने वाली क्रिया एप्लिकेशन नियंत्रक में कुछ होगी, है ना? इसके अलावा, मैं "<% form_for टास्क.न्यू डू | एफ | -%>" का उपयोग कर एक हैक नहीं है? –

+0

धन्यवाद मैटएमकेकेनाइट हमें सूचित करने के लिए कि आंशिक केवल जानता है कि कंटेनर व्यू क्या जानता है। मैंने अपना जवाब अधिक सटीक होने के लिए संपादित किया। – Petros

+0

किसी मॉडल पर क्लास विधि कॉल करने के लिए कोई हैक नहीं है। कॉलिंग <% कार्यों = टास्क.फिंड (: सभी,: शर्तें => "पूर्ण = झूठी")%> आंशिक में एक हैक के करीब होगा। मुझे लगता है कि कुछ लोगों को रेल में समझ में नहीं आता है कि केवल एक ही क्रिया (उर्फ नियंत्रक विधि) कहलाती है। – MattMcKnight

1

आंशिक जरूरतों बुला ERB फ़ाइल में एक चर के बारे में पता करने के लिए हैं, तो आप इसे इस तरह पारित कर सकते हैं

<% form_for task do |f| %> 
    <%= f.text_field :body %> 
    <%= submit_tag "Submit" %> 
<% end %> 

वह @ के बिना है। (कोड a: b:a => b की सिर्फ एक और अधिक सुविधाजनक रूप है।)

मुझे आश्चर्य है, हालांकि, तुम क्यों फ़ाइल application.html.erb में partials का उपयोग करना चाहते हैं? मुझे लगता है कि आप रूबी-जेनरेट की गई फ़ाइल app/views/layouts/application.html.erb का मतलब है, जिसे एक लेआउट फ़ाइल के रूप में उपयोग किया जाना चाहिए जिसमें आपके सभी एप्लिकेशन के पृष्ठों के लिए सामान्य तत्व शामिल हैं, व्यवसाय तर्क के लिए नहीं। शायद आपको जिस फ़ाइल को आंशिक कॉल करने की आवश्यकता है वह app/views/tasks/index.html.erb है?

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