2017-06-19 14 views
3

Ruby 2.3.0 & rails 4.2.6を使用しています。私はのparamsでハッシュのネストされた配列とハッシュを持っている、と私は、ファイルに書き込むruby​​ on railでobject.to_yaml(YAML)を使用すると "!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: 
- !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 

abc.yamlそのそれはハッシュ・シリアル化するための機能ですhere を述べましたwith-ivarsが2.0.9のバージョンのpsych gemに追加されました。シミジェムは現在Rubyの標準ライブラリの一部であり、この特定のバージョンはstdlib 2.3.0 preview1バージョンに追加されています。

しかし、私はyamlファイルを他の追加のパラメータを追加しないできれいに保つために努力しています。 ruby/hash-with-ivars:ActionController ::ファイルに書き込む際のパラメータ、要素、およびivarsを削除するにはどうしたらいいですか?

+0

どのように 'hash'は見えますか? –

+1

Railsのバージョンとタイプの "ハッシュ"を少なくとも提供しなければなりません。 '4.x'と' ActionController :: Parameters'のようです。だから、平らなヤムを得るためには、まずハッシュを平易にするべ​​きです! 'hash.to_hash.to_yaml'や' hash.as_json.to_yaml'のようなものを使用してください。 –

+0

@PavelMikhailyuk to_hashが機能しました!ありがとう!それを答えとして追加してもらえますか? – dips

答えて

3

実際にhashActionController::Parametersのインスタンスであり、Hashクラスではありません。したがって#to_yamlActionController::Parametersの内部表現も保存されています。
プレーンなYAMLを取得するには、最初にHashに変換する必要があります。

Railsの4

hash.to_hash.to_yaml(indentation: 8) 

Railsの5 - #to_hashは廃止され、#to_unsafe_hを使用する代わりに、または#as_jsonActiveSupport::HashWithIndifferentAccessを返す):

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

ありがとうございました:) – dips

関連する問題