rescue true

5 mayo, 2010

Problemas al guardar relaciones has_and_belongs_to_many sin seleccionar ningún checkbox

Filed under: Relaciones,Ruby on Rails — xurdekio @ 6:00 am
Tags: , , ,

Lo habitual al definir una relación has_and_belongs_to_many que vamos a gestionar desde la propia aplicación via web es que usemos checkbox para marcar los miembros de la relación. Un ejemplo típico de esto son usuarios que pertenecen a un grupo.

Tendremos una vista en la cual mostramos los checks con su label correpondiente:

<%if @groups.any?%>
  	<ul>
		<%for group in @groups do%>
			<li>
				<%input_id = "user_group_ids_#{group.id}"%>
				<%=check_box_tag "user[group_ids][]", group.id, @user.group_ids.include?(group.id), :id => input_id%>
				<%=label_tag input_id, group.name%>
			</li>
		<%end%>
	</ul>
<%end%>


Usamos como atributo el método group_ids que nos define dinámicamente la relación has_and_belongs_to_many nos permitirá recibir los parámetros de la forma:

:user => {:group_ids => [1,2,3......n]}

Y asignarlos directamente tanto con el @user.update_attributes(params[:user]) como con el User.new(params[:user]).
El problema nos lo encontramos cuando un usuario ya tiene asignados uno o varios grupos y los desmarcamos todos. El hash de parámetros llega entonces sin la key :group_ids, y la relación no se actualiza eliminando los grupos del usuario.
La solución entonces es comprobar si no existe la key en el hash de parametros y crearla vacia, para que el objeto actualice la relación un array de ids vacias, mi forma de hacerlo es en el controlador:

 before_filter :format_parameters, :only => [:create, :update]
private
 def format_parameters
    params[:user][:group_ids] = [] if params[:user] and params[:user][:group_ids].blank?
 end

Rápido, fácil, sencillo y para toda la familia.

2 comentarios »

  1. otra opcion es
    def format_parameters
    params[:user][:group_ids] ||= []
    end

    que usa notacion ruby😉

    Esta bien el blog🙂

    Comentario por Fer — 25 agosto, 2010 @ 10:05 am | Responder

  2. Si haces eso y no hay params[:user] petaria el filtro, en todo caso params[:user][:group_ids] ||= [] if params[:user]
    Thx!

    Comentario por xurdekio — 25 agosto, 2010 @ 10:48 am | Responder


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: