2013-05-02 14 views
31

मेरे पास एक नियंत्रक है जो html और js दोनों का जवाब देता है। html दृश्य पूरे पृष्ठ (शीर्षलेख और पाद लेख सहित) प्रस्तुत करता है, जबकि js केवल #main को प्रतिस्थापित करता है। हेडर और पाद लेख के अलावा, दोनों प्रारूप समान सामग्री प्रस्तुत करते हैं। मैं तीन फाइलों के साथ इस प्रभाव को प्राप्त कर सकते हैं:रेल: एक दृश्य (आंशिक नहीं) एक दृश्य के भीतर से

_show.html.erb 
<div>Content!</div> 

show.html.erb 
<%= render "show" %> 

show.js.erb 
$("#main").fadeIn("<%= escape_javascript(render 'show') %>"); 

यह काम करता है, लेकिन मुझे लगता है कि अगर मैं एक अलग _show आंशिक जरूरत नहीं थी पसंद करेंगे। दुर्भाग्य से, यह काम नहीं करता है:

show.html.erb 
<div>Content!</div> 

show.js.erb 
$("#main").fadeIn("<%= escape_javascript(render 'show') %>"); 

के रूप में रेल show आंशिक, न कि वास्तविक दृश्य के लिए दिखेगा।

क्या आंशिक की बजाय दृश्य फ़ाइल देखने के लिए रेल प्राप्त करने का कोई तरीका है?

+3

आप इस्तेमाल कर सकते हैं': च ile' विकल्प, उदा। ': फ़ाइल => 'शो''।रेंडर हेल्पर 'रेंडर' 'अवलोकन' के स्ट्रिंग तर्क को 'रेंडर: आंशिक =>' yourview'' में बदल देगा। हालांकि, जिस समस्या में आप भागने जा रहे हैं, वह यह है कि जेएस एक्शन में लुकअप संदर्भ जेएस संस्करण को "शो" को हल करने जा रहा है, जिसके परिणामस्वरूप असीमित लूप या कुछ ऐसा हो सकता है। – numbers1311407

+0

शुक्र है, यह लूप नहीं है। कम से कम अब तक नहीं। अभी के लिए मुझे एक 'लापता टेम्पलेट' त्रुटि मिल रही है। ऐसा लगता है कि यह खुद को भी नहीं ढूंढ सकता है। – nullnullnull

+1

किसी अन्य दृश्य के अंदर एक गैर-आंशिक दृश्य प्रस्तुत करना बिल्कुल रेलवे ™ नहीं है। आपका वर्तमान समाधान शायद बेहतर है। अगर आप नामकरण के बारे में अजीब महसूस करते हैं तो इसे '_body' का नाम दें। इस परिदृश्य में आप जो आम बात देखने जा रहे हैं वह 'रेंडर (@resource) 'है, जो आंशिक पथ में बदल जाती है उदा। 'संसाधन/_resource'। – numbers1311407

उत्तर

23

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

हालांकि यदि आपका विचार साझा किया जा सकता है, जैसा कि ऐसा लगता है कि यह इस मामले में हो सकता है, तो आप इसे केवल एक लेआउट बना सकते हैं।

यह इस तथ्य से सुगम है कि, कुछ हद तक आश्चर्य के सिद्धांत के खिलाफ, रेलटेम्पलेट js टेम्पलेट के लिए js टेम्पलेट मौजूद होगा यदि टेम्पलेट मौजूद है। इसका मतलब है आप, दोनों js टेम्पलेट, और आंशिक हटाने कि सकता है, और सिर्फ एक लेआउट हकदार बनाते हैं, उदाहरण के लिए fadein.js.erb: एक और गैर आंशिक दृश्य प्रतिपादन एक और दृश्य में है "

# yourviews/show.html.erb 
<div>Content!</div> 

# layouts/fadein.js.erb 
$("#main").fadeIn("<%= escape_javascript(yield) %>"); 

# YourController.rb 
def show 
    # ... 
    respond_to do |wants| 
    wants.html 
    wants.js { render :layout => "fadein" } 
    end 
end 
+3

धन्यवाद एक लाख। यह समाधान एक 'show.html.erb' में तीन फाइलें ('show.html.erb',' show.js.erb', और '_show.html.erb') उबालता है। मैं इसे मॉडल और कार्यों में लागू कर सकता हूं, और अभी भी केवल एक 'लेआउट/fadein.js.erb' फ़ाइल होने की आवश्यकता होगी। प्रतिभाशाली! – nullnullnull

+0

यह वास्तव में अच्छा काम किया! बहुत बहुत धन्यवाद। मेरे पास अभी एक सवाल था, मैं इसे "बनाने" परिदृश्य के लिए काम नहीं कर सका जहां एक फॉर्म सबमिशन मुझे मेरे द्वारा बनाए गए रिकॉर्ड पर रीडायरेक्ट करना चाहिए। मैंने रिमोट जोड़ा है: मेरे form_for में सच है, लेकिन यह टेम्पलेट बनाने के लिए खोज करता है भले ही मैंने जेएस के लिए लेआउट जेएस फ़ाइल को इंगित करने के लिए answer_to किया है। कोई सुझाव? धन्यवाद। – Kopty

+0

@ कोप्टी यह अभी भी जावास्क्रिप्ट लेआउट के अंदर HTML के रूप में टेम्पलेट को प्रस्तुत कर रहा है। तो यह अभी तक सामान्य रूप से एक निर्माण टेम्पलेट की तलाश करने जा रहा है जब तक कि आप इसे न कहें। यदि आप शो टेम्पलेट प्रस्तुत करना चाहते हैं, तो आप कुछ प्रस्तुत कर सकते हैं जैसे 'रेंडर: शो,: लेआउट => "फेडेन" ' – numbers1311407

9

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

  1. आपको लगता है कि एक से अधिक अतिरिक्त दृश्य आपके वर्तमान दृश्य के भीतर प्रस्तुत किये जा सकता है, तो आप कर रहे हैं सबसे अधिक संभावना एक लेआउट
  2. की तलाश में आपको लगता है कि आपके विचार में से एक लगता है चाहिए कई पृष्ठों में प्रदान की जा, तो आप एक आंशिक
  3. के लिए देख रहे हैं इस दृश्य इसके अंदर केवल एक अतिरिक्त दृश्य प्रस्तुत करना चाहिए, और उस दृश्य केवल वर्तमान दृश्य के अंदर रेंडर किया जाना चाहिए, आप ऊपर के किसी भी चुन सकते हैं या इसमें से कोई भी - यह है, एक फ़ाइल के साथ
13

अन्य लोगों की तरह का उल्लेख किया है, नहीं रेल रास्ता ", अगर फिर भी आप अभी भी इसे कर रही पर जोर देते हैं, एक विधि है:

<%= render :file => '<replace with relative/absolute path>' %> 
1

आप बस अपने render विधि करने के लिए एक संदर्भ पारित करने के लिए की जरूरत है:

<%= render :template => "show" -%> 
संबंधित मुद्दे