首页 > 解决方案 > 如何从rails中的多个check_box获取哈希值?

问题描述

我的应用程序中的某些多个元素之间存在 N 到 M 关系。所以,我想删除表单上的所有这些关系。为此,我在表单中包含一个复选框,并希望将 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 

标签: ruby-on-rails

解决方案


看看 api check_box_tag

check_box_tag(name, value = "1", checked = false, options = {}) 
  • 第一个参数是名称:值存储在什么下面,这通常显示在 params
  • 第二个参数是值,它被字符串化以制作 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)}。现在应该为您提供一个哈希数组(访问无关紧要,因此您可以使用符号键)。(另见Json::parse
  • 你现在可以得到你想要的值
  • 考虑在操作/过滤器等之前将其移动到帮助程序中,以便能够多次使用它,可能用于多个参数

推荐阅读