2010-01-07 4 views
1

J'essaie de passer un tableau dans un champ caché.Un problème d'édition Many-Many Association Hidden_Field. ROR

L'utilisateur suivant a 3 rôles [2,4,5]

>> u = User.find_by_login("lesa") 
=> #<User id: 5, login: "lesa", email: "[email protected]", crypted_password: "0f2776e68f1054a2678ad69a3b28e35ad9f42078", salt: "f02ef9e00d16f1b9f82dfcc488fdf96bf5aab4a8", created_at: "2009-12-29 15:15:51", updated_at: "2010-01-06 06:27:16", remember_token: nil, remember_token_expires_at: nil> 
>> u.roles.map(&:id) 
=> [2, 4, 5] 

Utilisateurs/edit.html.erb

<% form_for @user do |f| -%> 
<%= f.hidden_field :role_ids, :value => @user.roles.map(&:id) %> 

Quand je soumets ma forme d'édition, je reçois une erreur: ActiveRecord :: RecordNotFound en UsersController # mise à jour "Impossible de trouver le rôle avec ID = 245"

Ensuite, je tenté de modifier mes utilisateurs/edit.html.erb à:

<%= f.hidden_field :role_ids, :value => @user.roles.map(&:id).join(", ") %> 

Cédant ce que je crois est une chaîne: "role_ids" => "2, 4" (Sortie Obligatoire: "role_ids" => [ "2", "4"])

Quand je tentais à l'aide une boucle:

<% for role in Role.find(:all) %> 
    <%= f.hidden_field :role_ids, :value => @user.roles.map(&:id).join(",").to_a %> 
    <% end %> 

Encore une autre chaîne a donné lieu:

Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"84Fvxxo3ao8Fl+aytOFInrLatUpslfAJggleEyy4wyI=", "id"=>"5", "controller"=>"users", "user"=>{"password_confirmation"=>"[FILTERED]", "role_ids"=>"2, 4, 5", "password"=>"[FILTERED]", "login"=>"lesa", "email"=>"[email protected]"}} 

Toutes les suggestions? Cela a été un problème embarrassant.

Répondre

1

Si vous souhaitez soumettre un tableau de valeurs, je crois que vous pouvez faire quelque chose comme ceci:

<% @user.roles.each do |role| %> 
    <%= f.hidden_field 'role_ids[]', :value => role.id %> 
<% end %> 

Rails devrait alors fusionner la valeur de chaque champ caché avec le même nom 'role_ids[]' dans un tableau vous donnant quelque chose comme ceci:

Parameters: {"commit"=>"Update" ... "role_ids"=>["2", "4", "5"], ... }} 
+0

Voici comment cela a fonctionné pour moi '<% @ user.roles.each do | role | %> <% = f.hidden_field 'role_ids] [',: value => rôle.id%> <% end %> '.... N'oubliez pas d'inverser les crochets pour role_ids] [, je ne sais pas pourquoi cela fonctionne, il serait génial si quelqu'un pouvait l'expliquer. – Zeeshan

0

si vous passez juste le u.roles.map (&: id) [0] que se passe-t-il? est la valeur = 2? Peut-être que la valeur n'accepte pas de valeur multiple ou peut-être que vous devez passer
<% = f.hidden_field: role_ids,: value => "# {u.roles.map (&: id) .join (',')}" >

+0

>> user.roles.map (&: id) => [2, 4, 5] >> user.roles.map (&: id) [0] = > 2 –

+0

Peut-être ... vous avez raison, il ne peut accepter qu'une seule valeur. Une boucle fonctionnerait-elle? <% pour son rôle dans Role.find (: tous)%> \t \t <% = f.hidden_field: role_ids,: valeur => @ user.role.id%> \t \t <% end %> –

+0

essayer de faire comme Andrew Nesbitt a dit: <% = f.hidden_field 'role_ids []',: value => rôle.id%> –

0

Vous pouvez faire le travail dans l'action d'édition du contrôleur (code air):

@role_ids = @user.roles.map(&:id).join(";") 

Dans la forme:

<%= f.hidden_field, 'role_ids', :value => @role_ids %> 

Puis, dans l'action de mise à jour:

roles = params[:user][:role_ids].split(";") 
1

Le accepté la réponse ne fonctionne pas pour moi. Cela fonctionne si vous utilisez hidden_field_tag mais pas avec f.hidden_field. Je dois recourir à

<%= f.hidden_field 'role_ids][', value: role.id %> 

Notez le support inversé.