如何从Rails中的多个check_box获取哈希值?

时间:2018-12-28 19:03:17

标签: ruby-on-rails

我的应用中一些倍数元素之间存在N对M的关系。因此,我想删除表单上的所有这些关系。为此,我在表单中包含一个check_box,并希望将N.id和M.id传递给我的控制器。

一切都顺利传递给我的控制器。但是尝试检索这些值时出现错误。

    <% duplicated.each do |element|%>
      <tr id="row_user_<%=element["product_lot"].id%>">
        <td><%= check_box_tag "product_lots[]", {:bol_id => element["bill_of_lading"].id, :product_lot_id => element["product_lot"].id} %>

在我的控制器中,我得到了:

selected_product_lots = params[:product_lots]

selected_product_lots.each do |element|
  logger.debug("#{element[:bol_id]}")
end    

如果我在params [:product_lots]上进行打印,我将拥有:

["{:bol_id=>3086, :product_lot_id=>6021}"] 

所以,我想知道如何从每个元素中获取bol_id和product_id。目前,我尝试执行此操作时出现错误:

#{element[:bol_id]}"


no implicit conversion of Symbol into Integer 

1 个答案:

答案 0 :(得分:1)

查看check_box_tag的api:

check_box_tag(name, value = "1", checked = false, options = {}) 
  • 第一个参数是名称:值存储在什么位置,通常以参数形式显示
  • 第二个参数是值,它被字符串化以制作html标签。
  • 第三是开始检查状态
  • 最后是选项

因此,由于将对象传递给值,所以rails对该对象调用.to_s以创建html标签。这就是为什么出现no implicit conversion of Symbol into Integer错误的原因,因为您正在对字符串调用[…],该字符串返回字符串的第n个字符。不幸的是,这不是最好的错误消息,因为它没有提到您正在访问字符串,而不是哈希,并且对于数组也将是相同的错误消息。您可能想要的是对值进行序列化,以便以后可以将其反序列化:

  • 尝试在第二个参数上调用.to_json。这会将您在params[:product_lots]中的值更改为['{"bol_id": 3086, "product_lot_id": 6021}']
  • 请注意,这仍然是一个字符串,因此您需要对它进行反序列化(尽管Rails可能会根据配置和过滤器等自动对它进行反序列化)。
  • 尝试params[:product_lots].map!{|data| JSON.parse(data, object_class: HashWithIndifferentAccess)}。现在,这应该为您提供一个哈希数组(with indifferent access,因此您可以使用符号键)。 (另请参见Json::parse
  • 您现在可以获取所需的值
  • 考虑在操作/过滤器等之前将其移动到帮助器中,以便能够多次使用(可能用于多个参数)