2011-03-21 7 views
19

मुझे थोड़ा डेमो सेटअप मिला है जिसमें एक चेकबॉक्स पर क्लिक करके AJAX के माध्यम से एक विशेषता को टॉगल करता है। यह ठीक काम कर रहा है, लेकिन रेल वास्तव में कुछ प्रस्तुत करना चाहता है, इसलिए मैंने मूल रूप से मेरे विचारों में एक खाली toggle.js.erb फ़ाइल बनाने का सहारा लिया है। सवाल मेंरेल चेकबॉक्स AJAX कॉल, कुछ भी प्रस्तुत नहीं करना चाहते हैं

नियंत्रक कार्रवाई:

def toggle 
    @task = Task.find(params[:id]) 
    respond_to do |format| 
    format.js do 
     if (@task.status != true) 
     @task.status = true 
     else 
     @task.status = false 
     end 
     @task.save 
     render :layout => false 
    end 
    end 
end 

सवाल में देखें:

<h1>Tasks</h1> 
    <ul style="list-style-type: none;"> 
    <% @tasks.each do |task| %> 
     <li id="<%= dom_id(task) %>"> 
     <%= check_box_tag(dom_id(task), value = nil, checked = task.status) %> 
     <%= task.action %> <%= link_to 'Edit', edit_task_path(task) %> 
     <%= link_to 'Delete', task, :confirm => 'Are you sure?', :method => :delete, :remote => true %> 
     </li> 
    <% end %> 
    </ul> 
    <%= link_to 'New Task', new_task_path %> 

    <script> 
    $$('input').each(function(el) { 
     el.observe('click', function(event) { 
     // Get the task ID 
     var elId = el.id.split("_")[1]; 
     // Build the toggle action path 
     var togglePath = '/tasks/' + elId + '/toggle/'; 
     // Create request, disable checkbox, send request, 
     // enable checkbox on completion 
     new Ajax.Request(togglePath, { 
      onCreate: function() { 
      el.disable(); 
      }, 
      onSuccess: function(response) { 
      }, 
      onComplete: function() { 
      el.enable(); 
      } 
     }); 
     }); 
    }); 
    </script> 

खाली toggle.js.erb फ़ाइल मैं विचारों में, रेल अभी भी मिल गया है के बिना मुझे यह कहते हुए एक त्रुटि देता है कि यह कुछ प्रस्तुत करने की कोशिश कर रहा है।

आखिरकार, मैं दोनों को एक खाली toggle.js.erb फ़ाइल नहीं रखना चाहूंगा, और मैं उस प्रोटोटाइप सामग्री को अपनी स्थिर जावास्क्रिप्ट सामग्री और दृश्य के बाहर प्राप्त करना चाहता हूं।

मैं रेल के लिए काफी नया हूं, इसलिए ऐसा करने का शायद एक आसान तरीका है, लेकिन मैं यहां फंस गया हूं।

उत्तर

41

render :layout => false का अर्थ है कि आप लेआउट के बिना 'टॉगल' दृश्य प्रस्तुत करना चाहते हैं।

आप सब पर कुछ भी प्रस्तुत करना नहीं चाहते हैं, तो आप का उपयोग करना चाहिए :nothing => true विकल्प

def toggle 
    @task = Task.find(params[:id]) 
    @task.toggle! :status 

    # if it used only by AJAX call, you don't rly need for 'respond_to' 
    render :nothing => true 
end 

संपादित करें: Rails4/5 में आप render nothing: true के बजाय head :ok उपयोग कर सकते हैं, यह यह करने के लिए अधिक बेहतर तरीका है , लेकिन परिणाम वही है।

+0

धन्यवाद! यह बिल्कुल काम किया। आपकी टॉगल विधि मेरी तुलना में काफी बेहतर है। पिछले धागे पर किसी ने चिंता जताई थी कि चेकबॉक्स को स्पैम करने वाला कोई व्यक्ति टॉगल की सटीकता को फेंक सकता है, लेकिन मैंने इसे अभी बनाया है ताकि एक क्लिक के बाद चेकबॉक्स अक्षम हो जाए जब तक कि AJAX ईवेंट सफल न हो जाए। – clem

+1

बिल्कुल सही :) यदि आपको स्थिति कोड सेट करने और तुरंत अपने नियंत्रक विधि से वापस लौटने की आवश्यकता है: 'प्रस्तुत करें: कुछ भी नहीं>> सत्य,: स्थिति => 404 और वापसी' आशा है कि इससे मदद मिलती है! – lboix

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