我有一个允许用户汇总哈希的表单。
哈希所需的结束格式将是这样的:
{1 => “a”,2 => “x”,3 =>的 “m”}
我可以通过在名称中包含内部括号的大量输入来构建类似的东西:
<%= hidden_field_tag "article[1]", :value => a %>
然而,最终结果是构建一个散列,其中所有键都是字符串而不是整数:
{“1”=&gt; “a”,“2”=&gt; “x”,“3”=&gt;的 “m”}
我目前正在通过循环输入哈希在控制器中生成新哈希,然后将其分配给params来解决此问题。是否有更清洁,干燥的方法来做到这一点?
答案 0 :(得分:2)
你的参数总是带有字符串键和值。解决此问题的最简单方法是将自己的扩展名编写为Hash,或者只是根据需要进行注入:
numeric_keys = params['article'].inject({ }) do |h, (k, v)|
h[k.to_i] = v
h
end
然后你有一个哈希,键可以转换成整数值,如你所愿。
简单的扩展可能是:
class Hash
def remap_keys
inject({ }) do |h, (k, v)|
h[yield(k)] = v
h
end
end
end
这更通用,可以按照以下方式使用:
params['article'].remap_keys(&:to_i)
答案 1 :(得分:1)
这取决于你想用它做什么。也许更容易使用字符串作为键,并在访问数组时进行“转换”(或根本不进行)?
也可以使用
之类的东西构建数组<%= hidden_field_tag "article[]", :value => "x" %>
这会将“article”作为数组返回,您可以通过索引直接访问它。但是,没有办法影响位置 - 数组将按照外观的顺序包含所有值。
最后,您可以制作自己的Hash版本,或者只修改密钥,如上所述。