[英]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.