ruby-on-rails - 如何从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
解决方案
看看 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
) - 你现在可以得到你想要的值
- 考虑在操作/过滤器等之前将其移动到帮助程序中,以便能够多次使用它,可能用于多个参数