2012-08-23 16 views
11

Tengo un modelo de Tarea, que se une en una relación de muchos a muchos con un modelo de Objetivo.Formas de rieles: cuando no se marcan casillas de verificación, param no está incluido en POST

Tengo un formulario de edición de tareas donde un usuario puede asociar cualquier objetivo con una tarea a través de casillas de verificación. Cuando se marca una casilla de verificación, debe indicar una asociación entre la tarea y un objetivo particular; cuando una casilla de verificación no está marcada, no debería haber ninguna asociación. Esto debe persistir en la base de datos cuando se envía el formulario.

<%= form_for @task do |f| %> 
    <% Objective.all.each do |objective| %> 
    <%= check_box_tag :objective_ids, objective.id, @task.objectives.include?(objective), :name => 'task[objective_ids][]' %> 
    <% end %> 
    <%= f.button :submit %> 
<% end %> 

Actualización de una tarea parece funcionar absolutamente bien siempre y cuando una casilla de verificación está marcada por el usuario, pero cuando el usuario no comprueba ninguna casilla de verificación, el :objective_ids parámetro (que es una tabla de id Objetivo) no está incluido en la acción POST en absoluto. Debido a esto, cuando hago @task.update_attributes(params[:task]) en el controlador, la colección de objetivos de la tarea no se actualiza (es decir, la tarea ya no debe tener ningún objetivo asociado, porque no se marcaron las casillas de verificación).

Entonces, ¿cómo puedo asegurarme de que el parámetro :objective_ids esté incluido en el POST, aunque solo sea como una matriz vacía?

Respuesta

23

Añadir campo oculto por encima de todas las casillas con valor vacío. Se enviará en caso de que el usuario no marque ninguna casilla de verificación.

<%= form_for @task do |f| %> 
    <%= hidden_field_tag "task[objective_ids][]", nil %> 
    <% Objective.all.each do |objective| %> 
    <%= check_box_tag :objective_ids, objective.id, @task.objectives.include?(objective), :name => 'task[objective_ids][]' %> 
    <% end %> 
    <%= f.button :submit %> 
<% end %> 

Aquí es un buen railscasts sobre esto.
Es posible que también desee comprobar el source code para ello.

+0

Gracias. Funciona un encanto. –

+2

solución Uno más aquí: http://asciicasts.com/episodes/17-habtm-checkboxes –

+0

@Jignesh, está en mi respuesta;) – cutalion

Cuestiones relacionadas