无法在Ruby / RoR中的递归函数中推入数组

时间:2018-06-12 16:51:48

标签: ruby-on-rails ruby recursion hash yaml

我想在Ruby On Rails中操作以下语言环境.yml文件:

fr: back: Retour signup: Inscription helpers: submit: create: "Créer votre %{model}" hello: world: "Bonjour le monde"

所以我在我的控制器中解析它,如:

@yml_hash = YAML.load_file("config/locales/en.yml")

然后我在html.erb文件中使用以下帮助程序处理它:

module TranslationHelper

    def render_hash(hash)
        return ihash(hash)
    end

    def ihash(h, key = [], result = [])
        h.each_pair do |k,v|
            if v.is_a?(Hash)
                key << k
                ihash(v, key, result)
            else
                result << {full_key: key, key: k, value: v}
            end
        end
        result
    end

end

它返回输出:

[{:full_key=>["fr", "helpers", "submit", "hello"], :key=>"back",
  :value=>"Retour"},
 {:full_key=>["fr", "helpers", "submit", "hello"], :key=>"signup",
  :value=>"Inscription"},
 {:full_key=>["fr", "helpers", "submit", "hello"], :key=>"create",
  :value=>"Créer votre %{model}"},
 {:full_key=>["fr", "helpers", "submit", "hello"], :key=>"world",
  :value=>"Bonjour le monde"}]

但实际上我的目标是在哈希中得到一个值的完整键,如下所示:

[{:full_key=>["fr"], :key=>"back", :value=>"Retour"},
 {:full_key=>["fr"], :key=>"signup", :value=>"Inscription"},
 {:full_key=>["fr", "helpers", "submit"], :key=>"create", :value=>"Créer votre %{model}"},
 {:full_key=>["fr", "hello"], :key=>"world", :value=>"Bonjour le monde"}]

有没有办法在我的函数中处理哈希以获得那些结果?

感谢。

1 个答案:

答案 0 :(得分:0)

我认为您需要使用clone方法来创建新数组,因为引用相同的数组对象(key << k



正确:

def ihash(h, key = [], result = [])
  h.each_pair do |k,v|
    if v.is_a?(Hash)
      new_key = key.clone
      new_key << k
      ihash(v, new_key, result)
    else
      result << {full_key: key, key: k, value: v}
    end
  end
  result
end


快乐的编码!