将数组传递给hidden_​​field ROR

时间:2010-01-06 18:22:17

标签: ruby-on-rails arrays hidden-field

我正在尝试将数组传递给hidden_​​field。

以下用户有3个角色[2,4,5]

>> u = User.find_by_login("lesa")
=> #<User id: 5, login: "lesa", email: "lesa.beaupry@gmail.com", 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]

用户/ edit.html.erb

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

当我提交编辑表单时,收到错误:UsersController中的ActiveRecord :: RecordNotFound #update“无法找到ID为245的角色

如何将数组传递给hidden_​​field?

8 个答案:

答案 0 :(得分:94)

我会使用这种技术。

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

:multiple[]添加到name属性的末尾,将multiple="multiple"添加到input元素,这是理想的。 Rails在为数组生成输入时会在内部使用它,例如在fields_for

不幸的是,没有详细记录。我打算解决这个问题。

答案 1 :(得分:13)

唯一对我有用的东西(Rails 3.1)是使用hidden_​​field_tag:

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

答案 2 :(得分:4)

我认为这对我这样的人来说仍然会有所帮助,他们用Google搜索同样的问题。我想出了下一个小黑客:

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

(注意隐藏字段的'object_name'参数中的反转括号。)

答案 3 :(得分:2)

尝试:

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

答案 4 :(得分:1)

使用Rails 4.2.6

我能够使用

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

呈现:

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

尝试使用hidden_field_tag'role_ids[]'参数详细信息未包含在我的form_params中。

这没有用:

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

因为它呈现:

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

并且由形式参数的控制器外部看到。

答案 5 :(得分:0)

尝试:

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

答案 6 :(得分:0)

我意识到最初的问题涉及Rails form_for表单,但是我在尝试向form_tag表单添加隐藏字段时遇到了这个问题。解决方案略有不同。

hidden_field_tag一直将我的ID转换为以空格分隔的字符串,例如"1 2 3",而不是我想要的["1", "2", "3"]数组。根据{{​​3}},这是hidden_field_tag的已知问题。这种方法最终适用于我的Rails 6 form_tag表单:

在视图中:

<%= hidden_field_tag :role_ids, my_role_ids_array %>

在控制器中:

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

答案 7 :(得分:0)

可以通过以下方式解决此类问题:

      <% params[:filter].each do |filter| %>
        <%= hidden_field_tag 'filter[]', filter %>
      <% end %>
相关问题