我的应用中一些倍数元素之间存在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
答案 0 :(得分:1)
查看check_box_tag
的api:
check_box_tag(name, value = "1", checked = false, options = {})
因此,由于将对象传递给值,所以rails对该对象调用.to_s
以创建html标签。这就是为什么出现no implicit conversion of Symbol into Integer
错误的原因,因为您正在对字符串调用[…]
,该字符串返回字符串的第n个字符。不幸的是,这不是最好的错误消息,因为它没有提到您正在访问字符串,而不是哈希,并且对于数组也将是相同的错误消息。您可能想要的是对值进行序列化,以便以后可以将其反序列化:
.to_json
。这会将您在params[:product_lots]
中的值更改为['{"bol_id": 3086, "product_lot_id": 6021}']
。 params[:product_lots].map!{|data| JSON.parse(data, object_class: HashWithIndifferentAccess)}
。现在,这应该为您提供一个哈希数组(with indifferent access,因此您可以使用符号键)。 (另请参见Json::parse
)