[英]How to load yaml with ruby 2.1
我在tmp.yml中有以下数据。 我的目标是将数据加载到mysql数据库。
我有以下代码从tmp.yml加载数据:
$LOAD_PATH.unshift( File.join( File.dirname(__FILE__), 'lib' ) )
require 'yaml'
require 'AacflmDirection' # Just an empty class
SITE_PATH = '/var/www/test/testme/asian_cinema/tmp.yml'
doc = YAML::load( File.open( SITE_PATH ) )
puts doc[0]['attributes']['position'] # Expect position = 1
我得到了这个错误。 看来我无法通过哈希访问它。
load.rb:8:in `<main>': undefined method `[]' for #<AacflmDirection:0x000000023c9fe0> (NoMethodError)
tmp.yml
--- !ruby/object:AacflmDirection
attributes:
position: "1"
film_id: "1"
created_on: 2012-02-06 09:31:31
page_id: "2671"
director_id: "1"
id: "1"
site_id: "173"
director:
film:
page:
site:
--- !ruby/object:AacflmDirector
assets:
attributes:
slug: paul-cox
name: Paul Cox
bio_markup: ""
created_on: 2012-02-06 09:31:39
page_id: "2671"
id: "51"
bio:
site_id: "173"
directions:
draft:
films:
page:
pathprints:
settings_objects:
site:
您要反序列化对象,而不是散列。 doc[0]
是AacflmDirection
的实例。 您需要使用它们提供的任何访问器来访问它们。
尝试doc[0].position
。
首先,三个连字符---
在yaml中分隔多个文档。 然后后面的!ruby/object...
会将您的文件反序列化为一个对象,而不是哈希。
在原始代码中,您仅将AacflmDirection
对象作为doc
变量。 使用YAML::load_stream
加载yaml中的所有对象。
require 'AacflmDirector'
require 'AacflmDirection'
doc = YAML::load_stream( File.open( SITE_PATH ) )
这样,您将获得:
=> [#<AacflmDirection:0x007fa62c1c3a48
@attributes=
{"position"=>"1",
"film_id"=>"1",
"created_on"=>2012-02-06 17:31:31 +0800
"page_id"=>"2671",
"director_id"=>"1",
"id"=>"1",
"site_id"=>"173"},
@director=nil,
@film=nil,
@page=nil,
@site=nil>,
#<AacflmDirector:0x007fa62c1bbe10
@assets=nil,
@attributes=
{"slug"=>"paul-cox",
"name"=>"Paul Cox",
"bio_markup"=>"",
"created_on"=>2012-02-06 17:31:39 +0800,
"page_id"=>"2671",
"id"=>"51",
"bio"=>nil,
"site_id"=>"173"},
@directions=nil,
@draft=nil,
@films=nil,
@page=nil,
@pathprints=nil,
@settings_objects=nil,
@site=nil>]
然后在您的AacflmDirection
类定义中添加attr_accessor :attributes
。 因此,您可以通过以下方式获得价值:
doc[0].attributes["position"]
使用YAML::load_file(SITE_PATH)
读取文件并将其转换为Ruby对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.