将参数或 HashWithIndifferentAccess 中的值转换为可用的哈希值

Converting values in Parameters or a HashWithIndifferentAccess to a useable hash

当值包含哈希时,我无法找到一种方法来转换参数哈希或对哈希无差异访问的哈希。

我在转换时遇到问题:

hash_indif = {"1570"=>"{:enabled=>false}",
              "1571"=>"{:enabled=>false}",
              "1572"=>"{:enabled=>false}",
              "1573"=>"{:enabled=>false}",
              "1574"=>"{:enabled=>false}",
              "1575"=>"{:enabled=>false}",
              "1576"=>"{:enabled=>false}",
              "1577"=>"{:enabled=>false}",
              "1578"=>"{:enabled=>false}"}

为此:

hash_thing = {1570 => {:enabled => false},
              1571 => {:enabled => false},
              1572 => {:enabled => false},
              1573 => {:enabled => false},
              1574 => {:enabled => false},
              1575 => {:enabled => false},
              1576 => {:enabled => false},
              1577 => {:enabled => false},
              1578 => {:enabled => false}}

如果可能的话,我希望能够使用方法链。

附加信息

这种情况是由于尝试更新同一个键的多个属性造成的。

哈姆尔:

- @a_feature.each do |af|
  .form-inline.radio-group
    %label= af.feature.name
    =radio_button "a_feature", af.id, [enabled: true], {checked: af.enabled, class:'form-control'}
    %label Yes
    =radio_button "a_feature", af.id, [enabled: false], {checked: !af.enabled, class:'form-control'}
    %label No

参数:

 {"utf8"=>"✓",
 "_method"=>"patch",
 "a_feature"=>{
 "296"=>"{:enabled=>true}",
 "344"=>"{:enabled=>false}",
 "376"=>"{:enabled=>false}",
 "commit"=>"Save",
 "agency_id"=>"7"}

这是一个不使用 eval 的快速解决方法

def to_bool(str)
    str == 'true'
end

new_hash = Hash.new
hash_indif.each do |i, j|
    inner_hash = Hash.new
    match_data = /^{:(enabled)=>(false|true)}$/.match(j)
    inner_hash[match_data[1].intern] = to_bool match_data[2]
    new_hash[i.to_i] = inner_hash
end

new_hash变量包含你需要的输出-

{1570=>{:enabled=>false}, 1571=>{:enabled=>false}, 1572=>{:enabled=>false}, 1573=>{:enabled=>false}, 1574=>{:enabled=>false}, 1575=>{:enabled=>false}, 1576=>{:enabled=>false}, 1577=>{:enabled=>false}, 1578=>{:enabled=>false}}