web-dev-qa-db-fra.com

Passer un tableau dans hidden_field ROR

J'essaye de passer un tableau dans un hidden_field.

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) %>

Lorsque j'envoie mon formulaire de modification, je reçois une erreur: ActiveRecord :: RecordNotFound dans UsersController # update "Impossible de trouver le rôle avec l'ID = 245"

Comment puis-je passer un tableau dans le champ hidden_field?

45
JZ.

J'utiliserais cette technique.

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

:multiple ajoute à la fois le [] à la fin de l'attribut de nom et multiple="multiple" à l'élément d'entrée, ce qui est idéal. Rails l'utilise en interne lorsqu'il génère des entrées pour des tableaux, comme dans fields_for.

Malheureusement, ce n'est pas bien documenté. Je vais chercher à résoudre ce problème.

101
Grant Hutchins

La seule chose qui fonctionne pour moi (Rails 3.1) est d'utiliser hidden_field_tag:

<% @users.roles.each do |role| %>
    <%= hidden_field_tag "user_role_ids[]", role.id %>
<% end %> 
14
Matteo Melani

Je pense que cela sera toujours utile pour les gens comme moi, qui ont googlé cette bande de roulement en posant la même question. Je suis venu avec le prochain petit hack:

<%= f.hidden_field "role_ids][", { :id => "role_ids", :value => [] } %>

(faites attention aux crochets inversés dans l'argument 'object_name' pour le champ caché).

4
atzkey

en utilisant Rails 4.2.6

J'ai pu utiliser

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

qui a rendu:

<input id="12345" value="12345" multiple="multiple" type="hidden" name="role_form[role_ids][]">

essayant d'utiliser hidden_field_tag ou la 'role_ids[]' les détails des paramètres n'étaient pas inclus dans mon form_params.

Cela n'a pas fonctionné:

<% @user.roles.each do |role|
  <%= hidden_field_tag 'role_ids[]', role %>
<% end %>

car il rend:

<input type="hidden" name="role_ids[]" id="role_ids_" value="12345">

et est vu par le contrôleur extérieur de la forme params.

2
mendokusai

Essayer:

 <% @user.roles.each_with_index do |role| %>
    <%= f.hidden_field "role_ids[]", :value => role.id %>
 <% end %>
2
jamuraa

essayez avec:

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

edit: note - vous devrez faire ids.split(", ") dans votre contrôleur pour les convertir d'une chaîne en un tableau

1
makevoid

Je me rends compte que la question originale impliquait un Rails form_for, mais je viens de rencontrer ce problème en essayant d'ajouter un champ caché à un form_tag forme. La solution est légèrement différente.

Le hidden_field_tag a continué à convertir mes identifiants en une chaîne séparée par des espaces, comme "1 2 3", pas le tableau de ["1", "2", "3"] ce que je voulais. D'après la documentation , il s'agit d'un problème connu avec hidden_field_tag. C'est l'approche qui a fini par fonctionner pour mon Rails 6 form_tag forme:

Dans la vue:

<%= hidden_field_tag :role_ids, my_role_ids_array %>

Dans le contrôleur:

role_ids = params[:role_ids].split(' ').map(&:to_i)
0
richardsonae