2010-01-06 19 views
34

Estoy tratando de pasar una matriz en un hidden_field.Al pasar una matriz en hidden_field ROR

El siguiente usuario tiene 3 funciones [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] 

Usuarios/edit.html.erb

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

cuando presente mi formulario de edición, que recibirá un error: ActiveRecord :: RecordNotFound en UsersController # update "No se pudo encontrar la función con ID = 245"

¿Cómo puedo pasar una matriz al campo hidden_field?

Respuesta

81

me gustaría utilizar esta técnica.

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

:multiple añade tanto la [] al final del atributo nombre y multiple="multiple" al elemento de entrada, que es ideal. Rails usa esto internamente cuando genera entradas para matrices, como en fields_for.

Desafortunadamente no está bien documentado. Voy a buscar arreglar esto.

+3

No creo que esto funcione más en Rails 4 –

+2

Esto funciona en Rails 4 aunque genera entradas con el mismo id. – Montas

+2

No funciona para mí en Rails 4.0.2 cuando uso 'form_tag' con' hidden_field_tag', solo obtendría el último rol en 'params [: role_ids]'. Usar 'hidden_field_tag ​​'role_ids []'' funciona bien. –

0

tratan con:

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

Cerrar pero todavía no funciona. Salida necesaria: "role_ids" => ["2", "4"] Salida real: "role_ids" => "2, 4" –

2

Probar:

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

que parece hacer un hash, quizás lo piratearé con él. –

+0

prueba la nueva versión? – jamuraa

+0

Esto está cerca, lo que terminó funcionando fue ... <% f.fields_for: users do | builder | %> <% = render 'user_fields',: f => constructor%> <% end %> ENTONCES <% role = Role.find (: first)%> <% = f.hidden_field: role_ids,: value => role. id%> –

4

creo que seguirá siendo útil para la gente como yo, que esta banda de rodamiento en Google haciendo la misma pregunta. Se me ocurrió la siguiente pequeño truco:

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

(prestar atención a las ménsulas invertidas en el argumento 'object_name' para el campo oculto).

+3

Como probablemente pueda entender, es muy posible que esta técnica se rompa en una versión posterior de Rails ya que es bastante no estándar. – nertzy

12

La única cosa que funciona para mí (Rails 3.1) está utilizando hidden_field_tag:

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

Las comillas dobles alrededor de user_role_ids [] son ​​importantes. Las comillas simples no funcionaron para mí. –

+0

@MarkRobinson: esto no puede ser correcto. –

1

utilizando rieles 4.2.6

pude usar

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

que dictó:

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

tratando de utilizar hidden_field_tag o la 'role_ids[]' los detalles param no estaban siendo incluidos en mi form_params.

Esto no funcionó:

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

porque hace:

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

y es visto por el controlador fuera de los params de formulario.

Cuestiones relacionadas