2011-03-21 5 views
19

Tengo una pequeña configuración de demostración en la que al hacer clic en una casilla de verificación se alterna un atributo a través de AJAX. Está funcionando bien, pero Rails REALMENTE quiere renderizar algo, así que básicamente he recurrido a la creación de un archivo toggle.js.erb en blanco en mis vistas.Rails checkbox Llamada AJAX, no quiero representar nada

acción del controlador en cuestión:

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 

Ver en cuestión:

<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> 

Sin el archivo toggle.js.erb blanco que tengo en los puntos de vista, todavía rieles me da un error al decir que está tratando de representar algo.

En última instancia, me gustaría no tener que tener un archivo toggle.js.erb en blanco, y me gustaría incluir ese material Prototype en mi material JavaScript estático y fuera de la vista.

Soy bastante nuevo en Rails, por lo que probablemente haya una forma más fácil de hacerlo, pero estoy algo atrapado aquí.

Respuesta

41

render :layout => false significa que desea visualizar 'alternar' sin diseño.

Si no desea hacer nada en absoluto, debe utilizar la opción :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 

EDIT: En Rails4/5 se puede utilizar head :ok en lugar de render nothing: true, es mucho más preferible hacerlo , pero el resultado es el mismo.

+0

Gracias! Esto funcionó absolutamente. Tu método de alternar es mucho mejor que el mío. Alguien en un hilo anterior había planteado la preocupación de que alguien enviara correo no deseado a la casilla de verificación podría desviar la precisión del alternar, pero acabo de hacerlo para que la casilla de verificación esté desactivada después de un clic hasta que el evento AJAX devuelva un éxito. – clem

+1

Perfecto :) Si necesita establecer un código de estado y regresar inmediatamente desde su método de controlador: 'render: nothing => true,: status => 404 y return' Espero que ayude! – lboix