2009-04-07 7 views
7

pensé que debería haber sido una solución simple a este, ya que los carriles 2.3 cuenta con función de estas formas novedosas anidados. Básicamente, quiero crear o actualizar un usuario y asignarles roles al mismo tiempo.Objeto anidado con casillas de verificación: asignación de masa incluso con accept_nested_attributes_for?

Parece que estoy haciendo todo bien pero recibo el error ADVERTENCIA: No se pueden asignar en masa estos atributos protegidos: roles_attrributes.

Incluso he intentado cambiar la vista al usuario [permissions_attrributes] [ROLE_ID] porque pensé que tal vez la tabla de unión era confuso rieles.

De todas formas, alguna sugerencia sobre cómo debería funcionar esto en realidad?

Modelo

class User < ActiveRecord::Base 

    has_many :permissions 
    has_many :roles, :through => :permissions 

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

Extracto de vista (nótese que intentó sin éxito obtener fields_for para generar lo que quiero aquí, tal vez ese es mi problema?)

<% for role in Role.all %> 
<%= check_box_tag("user[roles_attrributes][id]",role.id) %> 
<%= role.rolename %> 
<br/> 
<% end %> 

Parámetros toparse parecen estar derecha:

{"user"=>{"password_confirmation"=>"[FILTERED]", 
"roles_attrributes"=>{"id"=>"2"}, ... 

Solución Una combinación de errores ortográficos, no usar attr_accessible, tener que acceder a los atributos_de_permisiones y estar un poco apagado.

Modelo:

has_many :permissions, :dependent => :destroy 
has_many :roles, :through => :permissions 
accepts_nested_attributes_for :permissions 
attr_accessible :permissions_attributes 

Vista:

<% Role.all(:order => "rolename ASC").each_with_index do |role,idx| %> 
    <%= check_box_tag("user[permissions_attributes][#{idx}][role_id]",role.id) %> 
    <%= role.rolename %> 
    <br/> 
    <% end %> 

Respuesta

3

suena como este atributo no está marcado como seguro para la actualización. Usted debe ser capaz de solucionarlo añadiendo lo siguiente a la clase del modelo:

attr_accessible :roles 

o posiblemente:

attr_accessible :roles_attributes 

Si nos fijamos, puede que ya tenga un attr_accessible llamada, puede agregar esto a. Para obtener más información esto está documentado aquí:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002226

+0

Tenía entendido que accept_nested_attributes_for no lo requería. De todos modos, lo intenté y ninguno de los dos funcionó. – Bill

+0

Ese mensaje de error es definitivamente uno que podría ser causado por un problema attr_protected o attr_accessible. También http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for indica que es algo a tener en cuenta incluso con ANAF. Posiblemente vale la pena mirar más de cerca? –

5

Si corrige la ortografía de atributos en su , parece que debería funcionar.

<% for role in Role.all %> 
<%= check_box_tag("user[roles_attributes][id]",role.id) %> 
<%= role.rolename %> 
<br/> 
<% end %> 
+0

¡Buena captura! Eso explicaría por qué el atributo no fue reconocido =) –

Cuestiones relacionadas