2011-12-23 17 views
7

मैं एक "टेम्पलेट" को "प्रतिपादन" के विचार के बारे में थोड़ा उलझन में आया हूं, जिस तरह से लेखक एक पुस्तक में इसके बारे में बोलता है ।रेल: वास्तव में इसका मतलब है कि "टेम्पलेट प्रस्तुत करना"

"एक टेम्पलेट प्रतिपादन" की मेरी मूल समझ यह थी कि इसका मतलब यह था कि रेल स्क्रीन पर दिखाई देने वाली सामग्री/दर्शकों को प्रस्तुत की जाती है (जिस तरह से आंशिक रूप से प्रस्तुत किया जाता है) लेकिन पुस्तक मैं हूं ऐसा लगता है कि कुछ और मतलब है कि "टेम्पलेट प्रतिपादन" की अवधारणा का उपयोग करना प्रतीत होता है। मुझे संदर्भ

यह पुस्तक (कार्रवाई में रेल 3) पारंपरिक layouts/application.html.erb फ़ाइल का उपयोग करके एक पृष्ठ लेआउट सेट करती है, और फिर यह views/tickets/show.html.erb जैसे विभिन्न दृश्य पृष्ठों को "उपज" देती है जो स्क्रीन पर अधिक सामग्री जोड़ती है। यह सब सीधा है ..

इस दृश्य के भीतर views/tickets/show.html.erb, आंशिक (जो एक सीधी अवधारणा भी है) का एक प्रतिपादन है।

<div id='tags'><%= render @ticket.tags %></div> 

अब इस आंशिक भीतर नहीं है, ajax का उपयोग कर, "tags_controller.rb" जो अधिकृत उपयोगकर्ताओं के लिए एक "टिकट" से एक "टैग" दूर करने के लिए अनुमति देने के लिए डिज़ाइन किया गया है में "निकालें" विधि के लिए एक कॉल हमारे नकली परियोजना प्रबंधन आवेदन में।

<% if can?(:tag, @ticket.project) || current_user.admin? %> 
    <%= link_to "x", remove_ticket_tag_path(@ticket, tag), 
     :remote => true, 
     :method => :delete, 
     :html => { :id => "delete-#{tag.name.parameterize}" } %> 
    <% end %> 

अब यहाँ टैग नियंत्रक में "निकालें" कार्रवाई (जो डेटाबेस में टिकट से टैग disassociates) ...

def remove 
    @ticket = Ticket.find(params[:ticket_id]) 
    if can?(:tag, @ticket.project) || current_user.admin? 
     @tag = Tag.find(params[:id]) 
     @ticket.tags -= [@tag] 
     @ticket.save 
    end 
    end 
end 

इस निकालें कार्रवाई के अंत में है, लेखक मूल रूप से render :nothing => true शामिल थे, लेकिन फिर उन्होंने कार्रवाई को संशोधित किया क्योंकि, जैसा कि वे कहते हैं, "आप इसे एक टेम्पलेट प्रस्तुत करने जा रहे हैं।" यहाँ है जहाँ मैं भ्रमित हो रहा है

है कि वह इस कार्रवाई हो जाता है रेंडर करने के लिए टेम्पलेट "remove.js.erb" है, जो केवल इसके अंदर jQuery में से एक लाइन है, जिसका उद्देश्य है से "टैग" दूर करने के लिए है पृष्ठ (यानी वह टैग जिसे उपयोगकर्ता स्क्रीन पर देखता है) अब यह डेटाबेस में टिकट से अलग हो गया है।

$('#tag-<%= @tag.name.parameterize %>').remove(); 

जब मैंने पढ़ा है "एक टेम्पलेट प्रतिपादन" मैं उम्मीद आवेदन पेज में सामग्री डालने जा करने के लिए है, लेकिन नियंत्रक में "निकालें" कार्रवाई द्वारा प्रदान की गई टेम्पलेट केवल एक jQuery समारोह है कि से एक तत्व को हटा कॉल पन्ना।

यदि कोई "टेम्पलेट" "प्रस्तुत किया गया" है, तो मुझे उम्मीद है कि एक और टेम्पलेट हटाया जाएगा (नए टेम्पलेट के लिए जगह बनाने के लिए), या मैं इस सामग्री को "प्रस्तुत" करने की अपेक्षा कर रहा हूं एक आंशिक प्रदान किया जाता है। क्या आप इस प्रश्न में jquery के साथ स्थिति में "टेम्पलेट" "rendered" जब वास्तव में क्या हो रहा है स्पष्ट कर सकते हैं? क्या यह वास्तव में उपयोगकर्ता के सामने एक नया पृष्ठ डालने वाला है (मुझे उम्मीद है कि किसी प्रकार का भौतिक पृष्ठ प्रस्तुत किया जाएगा)

+0

+1 एक अच्छी तरह लिखित प्रश्न – bragboy

उत्तर

3

आप लगभग वहां हैं! एक टेम्पलेट प्रस्तुत करना हमेशा सामग्री का उत्पादन करने के बारे में है, लेकिन सामग्री के थोड़ा विस्तृत विवरण के लिए। यह एचटीएमएल का एक हिस्सा हो सकता है, उदाहरण के लिए नई वस्तुओं को पाने के लिए अजाक्स कॉल नए आइटमों का वर्णन करने वाले कुछ एचटीएमएल उत्पन्न कर सकता है, लेकिन ऐसा नहीं होना चाहिए।

एक टेम्पलेट जावास्क्रिप्ट उत्पन्न कर सकता है क्योंकि यह आपके दूसरे उदाहरण में करता है। व्यक्तिगत रूप से मैं इससे बचने की कोशिश कर रहा हूं और इसके बजाय जेएसओएन को क्लाइंट को पास कर दूंगा और क्लाइंट साइड को जरूरी काम करने दें।

कुछ अन्य प्रतिपादन जो आप कर सकते हैं वह कुछ JSON उत्पन्न करना है। एपीआई अक्सर ऐसा करेंगे, लेकिन आप इसे सामान्य पृष्ठ पर भी कर सकते हैं। उदाहरण के बजाय कुछ जावास्क्रिप्ट प्रतिपादन एक्स आप json

{ to_delete: "tag-123"} 

प्रस्तुत करना और फिर अपने jQuery सफलता कॉलबैक कि पेलोड का उपयोग जो तत्व डोम से दूर करने के लिए, अपने आवेदन में यह होने से पता करने के लिए हो सकता है टैग हटाना के लिए। JS फ़ाइल

$('a.delete_tag').live('ajax:success', function(data){ 
    var selector = '#' + data.to_delete; 
    $(selector).remove() 
} 

(यह मानते हुए कि आपके हटाना लिंक क्लास 'delete_tag' था) प्रतिपादन JSON की तरह यह वास्तव में एक टेम्पलेट बिल्कुल नहीं है, क्योंकि आप आमतौर पर

render :json => {:to_delete => "tag-#{@tag.name.parameterize}"} 
के माध्यम से ऐसा होता है

हालांकि मुझे लगता है कि आप इसके लिए एक एआरबी टेम्पलेट का उपयोग कर सकते हैं (हालांकि मैं कल्पना नहीं कर सकता) क्यों।

+0

यह दिलचस्प है। क्या आप कुछ स्पष्टीकरण दे सकते हैं। टेम्पलेट का उपयोग करने के बजाय, मैंने प्रस्तुत करने का प्रयास किया: जेएस => "$ ('# टैग - <% = @ tag.name.parameterize%>')। हटाएं();" । यह काम करता है, लेकिन टैग को हटाने के लिए इसे एक पेज रीफ्रेश की आवश्यकता होती है, लेकिन अगर मैं इस jquery को टेम्पलेट में डालता हूं तो उसे टैग को हटाने के लिए रीफ्रेश करने की आवश्यकता नहीं होती है। जब आप लिखते हैं "क्या आपके jQuery सफलता कॉलबैक का उपयोग यह है कि यह पता लगाने के लिए कि कौन सी तत्व डीओएम से निकालना है," यह ऐसा कुछ है जो मुझे पृष्ठ को रीफ्रेश करने की समस्या के बिना प्रस्तुत करने की अनुमति देगा: जेएस? क्या आप समझा सकते हैं/दिखा सकते हैं कि कैसे? पहले ही, आपका बहुत धन्यवाद। – Leahcim

+0

मुझे संदेह है कि यदि आप जेएस प्रस्तुत करते हैं तो यह एआरबी टैग –

+0

के बजाय धन्यवाद सामान्य रूबी शैली इंटरपोलेशन (# {}) की अपेक्षा करता है। तुम सही हो। – Leahcim

2

मेरी समझ यह है कि js.erb इसके अंदर जावास्क्रिप्ट कार्यों को निष्पादित करके "प्रस्तुत" किया गया है। अक्सर नीचे की तरह कुछ किया जाता है:

jQuery(document).ready(function() { 
    jQuery('#element').html('<%= escape_javascript(render pages/content) %>'); 
}); 
+0

धन्यवाद के लिए +1, इसलिए इस समारोह में पृष्ठों/सामग्री को HTML तत्व में रखा जा रहा है? – Leahcim

+0

हां, वास्तव में आप सामान्य रूप से HTML.erb द्वारा प्रस्तुत की गई सामग्री को प्रस्तुत कर सकते हैं – prusswan

1

वहाँ http://guides.rubyonrails.org/layouts_and_rendering.html पर प्रतिपादन का एक बहुत संक्षिप्त सिंहावलोकन मदद मिल सकती है के रूप में यह भी ActionController::Base#render विधि का विवरण में चला जाता है और पर्दे के पीछे क्या होता है जब आप render :nothing का उपयोग करें (है उदाहरण के लिए)। प्रस्तुत करें लेकिन फ़ाइलों या इनलाइन कोड के लिए भी इस्तेमाल किया जा सकता है - न केवल पारंपरिक अर्थों में 'टेम्पलेट्स'।

+0

मैंने उस पृष्ठ पर विशेष रूप से 2.2.10 देखा, जो सीधे नियंत्रक क्रिया से जेएस को प्रस्तुत करने के बारे में निर्देश देता है जैसे render => " चेतावनी ('हैलो रेल'); " इसलिए, बस इसे आज़माने के लिए, मैंने 2.2.10 में वर्णित नियंत्रक में टेम्पलेट remove.js.erb से jquery को स्थानांतरित कर दिया, लेकिन जब मैंने तत्व पर क्लिक किया, तो मुझे हटाने के लिए पृष्ठ को रीफ्रेश करने की आवश्यकता थी । अगर मेरे पास remove.js.erb में jquery है, तो यह वास्तव में पृष्ठ को रीफ्रेश किए बिना तत्व को हटा देता है। समान लेकिन अलग। – Leahcim

+0

फ्रेडरिक चेंग की टिप्पणी देखें कि मुझे यह समस्या क्यों थी ... – Leahcim

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