web-dev-qa-db-ja.com

JSONデータをYAMLファイルに埋め込む

テーブルの備品を書いています。そして、列の1つは値としてJSON文字列を受け取ります。

問題は、フィクスチャがロードに失敗していないことです:

Fixture::FormatError: a YAML error occurred parsing /home/saurajeet/code/dcbox/test/fixtures/hardware.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html
The exact error was:
  ArgumentError: syntax error on line 145, col 73: `  portslist: [{"name":"ob1","port_num":0,"port_type":"network"},{"name":"ob2","port_nu'.....

これに対する解決策。

42
Saurajeet

私はそれを引用符に入れるとうまくいくと信じています:

portslist: '[{"name":"ob1","port_type" ... }]'
52
Vlad Khomich

受け入れられた回答に関するclarkevansのコメントは、行を折り返すことができるため、JSONの長いビットにはより良い回答を提案しました。私は彼が述べたブロックスカラー構文を調べ、ここに例を含めようと思いました。

portslist: >
  [{"name":"ob1","port_num":0,"port_type":"network"},
  {"name":"ob2","port_nu...
36
Paul Lynch

文字列がある場合は、Vlad Khomichが述べたように簡単に使用できます。

portslist: '[{"name":"ob1","port_num":0,"port_type":"network"},...]'

ERBを使用していて、オブジェクトがある場合は、to_jsonを使用して検査し、JSON文字列にエスケープできます。

portslist: <%= [{name: 'ob1', port_num: 0, port_type: 'network'},...].to_json.inspect %>

また、JSON仕様が大きい場合は、別のファイルに保存してRubyを使用して読み込むことができるため、YAMLファイルをクリーンに保つことができます。

portslist: <%= File.read('/path/to/file.json').inspect %>

完全にするために、 ActiveRecord::Store を使用している場合、JSONストアであっても、同じデータのYAML表現を使用してデータをロードできます。

one:
  portslist:
    - 
      name: 'ob1'
      port_num: 0
      port_type: 'network'
    - 
      name: 'ob2'
      port_num: 1
      port_type: 'network'
8
murb

私のテーブルでは、列stripe_connectはタイプ[〜#〜] jsonb [〜#〜]です。フィクスチャでは、これが機能しました。外側の単一引用符は必要ですが、角括弧は不要です。一重引用符の間はすべて1つの長い行です。

 stripe_connect: '{"scope":"read_write", "livemode":false, "token_type":"bearer", "access_token":"sk_test_madeupvalue", "refresh_token":"rt_Ae29madeupvalueyX", "stripe_user_id":"acct_103yZabcdefg", "stripe_publishable_key":"pk_test_0HEOmadeupvalue"}'
1
Norm