簡體   English   中英

如何使用Ruby 2.1加載YAML

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM