ruby on rails - Rails checkbox AJAX llama, no quiere renderizar nada
ruby-on-rails prototypejs (1)
render :layout => false
significa que desea renderizar la vista ''alternar'' sin diseño.
Si no desea renderizar nada, debería usar :nothing => true
option
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
EDITAR: En Rails4 / 5 puede usar head :ok
lugar de render nothing: true
, es la forma más preferible de hacerlo, pero el resultado es el mismo.
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.
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 la pregunta:
<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 en blanco toggle.js.erb que tengo en las vistas, Rails aún me da un error que dice que está intentando renderizar algo.
En última instancia, me gustaría no tener que tener un archivo toggle.js.erb en blanco, y me gustaría incluir ese Prototipo en mi JavaScript estático y fuera de la vista.
Soy bastante nuevo en Rails, así que probablemente haya una forma más fácil de hacer esto, pero estoy un poco atascado aquí.