【问题标题】:Passing an array into hidden_field ROR将数组传递到 hidden_​​field ROR
【发布时间】:2011-01-02 04:19:08
【问题描述】:

我正在尝试将数组传递到 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) %>

当我提交我的编辑表单时,我收到一个错误:ActiveRecord::RecordNotFound in UsersController#update "Couldn't find Role with ID=245"

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

【问题讨论】:

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


    【解决方案1】:

    我会使用这种技术。

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

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

    不幸的是,它没有很好的记录。我会考虑解决这个问题。

    【讨论】:

    • 这在 Rails 4 中确实有效,尽管它生成具有相同 id 的输入。
    • 在 Rails 4.0.2 中使用 form_taghidden_field_tag 时对我不起作用,我只能在 params[:role_ids] 中获得最后一个角色。使用hidden_field_tag 'role_ids[]' 工作正常。
    • @JeremyF。它不适用于hidden_field_tag,它必须是hidden_field
    • 如果你确实想使用 hidden_​​field_tag,那么&lt;%= hidden_field_tag('role_ids[]', role.id) %&gt;
    • 现在有文档吗?如果是的话,你能给我一个链接吗?谢谢
    【解决方案2】:

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

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

    【讨论】:

    • user_role_ids[] 两边的双引号很重要。单引号对我不起作用。
    【解决方案3】:

    试试:

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

    【讨论】:

    • 这似乎是一个哈希 - 也许我会破解它。
    • 这很接近,最终的工作是...... builder %> THEN role .id %>
    • 这对我来说是这样的 ` role.id %> ` .... 记住要反转 role_ids][ 的括号。如果我不反转括号,我在服务器日志中的 role_ids 参数的数组中得到 nil,使用反向括号它就像魅力一样。不知道为什么会这样,如果有人能解释一下就好了。
    【解决方案4】:

    使用 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】:

      尝试:

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

      编辑:注意 - 您需要在控制器中执行 ids.split(", ") 以将它们从字符串转换为数组

      【讨论】:

      • 关闭,但它仍然不起作用。所需输出:“role_ids”=>[“2”,“4”] 实际输出:“role_ids”=>“2, 4”
      • 不过,我发现这是最好的解决方案,只需将隐藏字段命名为 :concatenated_role_ids,然后在控制器操作的顶部添加 params[:role_ids] ||= params.require(:concatenated_role_ids).split(', ') 之类的名称。
      【解决方案6】:

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

      hidden_field_tag 不断将我的 id 转换为空格分隔的字符串,例如 "1 2 3",而不是我想要的 ["1", "2", "3"] 数组。根据the docs,这是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】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          • 2011-05-29
          • 2012-09-24
          • 1970-01-01
          相关资源
          最近更新 更多