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