Ruby on rails 将参数或HashWithInferenceTaccess中的值转换为可用的哈希

Ruby on rails 将参数或HashWithInferenceTaccess中的值转换为可用的哈希,ruby-on-rails,hash,parameters,haml,rails-activerecord,Ruby On Rails,Hash,Parameters,Haml,Rails Activerecord,当值包含散列时,我很难找到从参数散列或对散列具有不同访问权限的散列转换的方法 我在转换时遇到问题: hash_indif = {"1570"=>"{:enabled=>false}", "1571"=>"{:enabled=>false}", "1572"=>"{:enabled=>false}", "1573"=>"{:enabled=>false}",

当值包含散列时,我很难找到从参数散列或对散列具有不同访问权限的散列转换的方法

我在转换时遇到问题:

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"}
对此:

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"}
如果可能的话,我希望能够使用方法链接

其他信息

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

Haml:

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"}
参数:

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
新的_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}}

您是在寻找对所有哈希值都有效的
a_hash.to_s
值,还是在这个非常特殊的情况下有效的值是符号/哈希火箭/布尔格式?还有,这是如何创建的?在
{:enabled=>false}
散列的某个地方调用
#to_s
?我真的没有见过一个
hashwithindepertaccess
散列的功能像这样被破坏(这并不意味着什么,只是让人困惑)。你当然可以用
eval
,例如
res={};h、 keys.each{k|res[eval(k)]=eval(h[k])}
——但我强烈质疑任何此类解决方案的合理性,如果可能的话,我会首先看看我们是如何陷入这种情况的。不确定方法链接将如何应用或有帮助。@sbeam有效(如果愿意,将其作为解决方案发布)。几天后我会回来公布我是如何处理这种情况的细节。谢谢@Blinky可以工作,但是使用
eval()
几乎总是一个坏主意。一些坏家伙只需要找出如何将一些讨厌的代码放入其中一个字符串中,您的系统就会崩溃pwned@Gene哦,谢谢你的警告。将需要找到另一个解决方案或解决总体情况。