2017-06-19 28 views
3

我正在使用Ruby 2.3.0 & rails 4.2.6。我有一個在PARAMS哈希嵌套數組中的哈希,當我把它寫到一個文件當rails中的object.to_yaml(YAML)在ruby中時,可以刪除「!ruby/hash:ActionController :: Parameters」嗎?

hash = {"abc"=> [{"abc1"=>[{"key1" => value1},{"key2" => value2}]}]} 

File.open("abc.yaml",'w+') {|f| f.write hash.to_yaml(:indentation => 8) } 

abc.yaml

--- 
abc: 
- !ruby/hash-with-ivars:ActionController::Parameters 
    elements: 
      abc1: &2 
      - !ruby/hash-with-ivars:ActionController::Parameters 
        elements: 
          key1: value1 
          key2: value2 
        ivars: 
          :@permitted: false 
      - !ruby/hash-with-ivars:ActionController::Parameters 
        elements: 
          key1: value1 
          key2: value2 
        ivars: 
          :@permitted: false 
    ivars: 
      :@permitted: false 
      :@converted_arrays: !ruby/object:Set 
        hash: 
          *2: true 

它提到here 這是因爲序列化散列功能with-ivars在其2.0.9版本中加入了這個心靈寶石。這個心靈寶石現在是Ruby標準庫的一部分,它的這個特定版本已經添加到stdlib 2.3.0 preview1版本中。

但我想通過不添加任何其他額外的參數保持yaml文件清潔。如何刪除!ruby/hash-with-ivars:ActionController ::參數,元素和ivars在寫入文件時?

+0

如何'hash'樣子? –

+1

您必須至少提供Rails版本和「hash」類型。它看起來分別是'4.x'和'ActionController :: Parameters'。所以要得到簡單的yaml,你應該先得到純哈希!使用類似'hash.to_hash.to_yaml'或'hash.as_json.to_yaml' –

+0

@PavelMikhailyuk to_hash工作!謝謝!你能否把它添加爲答案? – dips

回答

3

其實你的hashActionController::Parameters的實例,而不是Hash類。所以#to_yaml也存儲ActionController::Parameters內部表示。
要獲得純YAML,您必須首先將其轉換爲Hash

軌道4

hash.to_hash.to_yaml(indentation: 8) 

Rails的5 - #to_hash已過時,使用#to_unsafe_h(返回ActiveSupport::HashWithIndifferentAccess)或#as_json代替:

hash.to_unsafe_h.to_yaml(indentation: 8) 
+0

謝謝你的細節:) – dips

相關問題