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?
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.
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 %>
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é).
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.
Essayer:
<% @user.roles.each_with_index do |role| %>
<%= f.hidden_field "role_ids[]", :value => role.id %>
<% end %>
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
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)