記事内にはプロモーションが含まれています

【Ruby】YAMLの使い方は?読み込み・書き出しからsafe_loadまで徹底解説

【Ruby】YAMLの使い方は?読み込み・書き出しからsafe_loadまで徹底解説 Ruby

Rubyでアプリケーションを開発する際、設定ファイルやデータの保存形式として「YAML(ヤムル)」を利用する機会は非常に多いです。

Railsの database.ymllocales ファイルなど、フレームワークでも標準的に採用されているため、RubyエンジニアにとってYAMLの操作は避けて通れないスキルと言えます。

しかし、いざ自分でYAMLを扱おうとすると、「loadload_file の違いは?」「セキュリティ的に safe_load を使うべき?」といった疑問や、バージョンの違いによるエラーに直面することもあるでしょう。

この記事では、Ruby標準ライブラリ(Psych)を使ったYAMLの基本的な読み込み・書き出し方法から、JSONとの相互変換、セキュリティリスクへの対策まで、実務で役立つ知識をサンプルコード付きで徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

RubyでYAMLを扱うための準備(標準ライブラリPsych)

Rubyには、YAMLを扱うための標準ライブラリとして Psych が組み込まれています。

そのため、追加でgemをインストールしなくても、require 'yaml' と記述するだけで強力なYAML操作機能を利用することができます。

モジュールの読み込み

まずは、スクリプトの冒頭でライブラリを読み込みましょう。

require 'yaml'

# これで YAML モジュールのメソッドが使えるようになります

基本的にはこれだけで準備完了ですが、環境によっては libyaml というC言語のライブラリが不足していると「yaml.h not found」のようなエラーが出ることがあります。

その場合はOSのパッケージマネージャー(apt, yum, brewなど)で libyaml-dev などをインストールする必要があります。

YAMLファイルを読み込む方法 (load_file / safe_load)

YAMLファイルをRubyのオブジェクト(ハッシュや配列)として読み込む方法はいくつかあります。

用途やセキュリティ要件に合わせて、適切なメソッドを選びましょう。

基本の YAML.load_file と YAML.load

ファイルから直接読み込む場合は YAML.load_file、文字列から読み込む場合は YAML.load を使用します。

sample.yml(読み込むファイル)

app_name: "MyApp"
version: 1.0
features:
  - login
  - search
database:
  adapter: postgresql

Rubyコードでの読み込み

require 'yaml'

# ファイルパスを指定して読み込む
config = YAML.load_file('sample.yml')

puts config['app_name']
# => MyApp

puts config['features']
# => ["login", "search"]

YAML.load を使う場合は、ファイルの中身を文字列として読み込んでから渡します。

yaml_string = File.read('sample.yml')
config = YAML.load(yaml_string)

セキュリティを意識した safe_load の使い方

かつて YAML.load には、悪意のあるYAMLデータを読み込ませることで任意のRubyコードを実行できてしまう脆弱性(Object Injection)のリスクがありました。

そのため、外部から受け取ったYAMLや信頼できないデータを扱う場合は、安全な YAML.safe_load メソッドを使用することが強く推奨されます。

yaml_data = <<~YAML
  name: "Guest"
  role: "User"
YAML

# 安全に読み込む
data = YAML.safe_load(yaml_data)

# シンボルをキーとして扱いたい場合
data_symbolized = YAML.safe_load(yaml_data, symbolize_names: true)

safe_load はデフォルトで基本的なクラス(Hash, Array, String, Integerなど)のみを許可し、独自のクラスなどは読み込めないように制限します。

もし特定のクラスを許可したい場合は、引数で指定することも可能です。

※注意: Ruby 3.1(Psych 4.0)以降、YAML.load もデフォルトで safe_load と同様の挙動に変更されている場合がありますが、明示的に safe_load を使う癖をつけておくのが無難です。

データをYAML形式で出力・保存する方法 (dump)

Rubyのハッシュや配列を、YAML形式のテキストデータに変換(シリアライズ)することも簡単です。

データのバックアップや、設定ファイルの自動生成などに役立ちます。

YAML.dump でオブジェクトを文字列化

YAML.dump メソッドを使うと、RubyオブジェクトをYAML形式の文字列に変換できます。

require 'yaml'

users = [
  { name: "Tanaka", age: 25 },
  { name: "Suzuki", age: 30 }
]

# YAML文字列に変換
yaml_output = YAML.dump(users)

puts yaml_output

実行結果は以下の通りです。

---
- :name: Tanaka
  :age: 25
- :name: Suzuki
  :age: 30

先頭に --- が付くのはYAMLの仕様で、ドキュメントの開始を表しています。

ファイルに書き出す手順 (dump to file)

変換したデータをそのままファイルとして保存したい場合は、File.open と組み合わせて使用します。

data = {
  "updated_at" => Time.now.to_s,
  "status" => "success",
  "items" => [1, 2, 3]
}

# 'output.yml' というファイルに書き出す
File.open('output.yml', 'w') do |file|
  YAML.dump(data, file)
end

YAML.dump の第2引数にIOオブジェクト(ファイルなど)を渡すことで、直接書き込みを行うことができます。

これにより、大規模なデータでもメモリ効率よく処理することが可能です。

応用編:JSON変換やエラー対応、Railsでの活用

ここからは、実務でよく遭遇する応用的なケースについて解説します。

YAMLとJSONの相互変換や、Rails特有の便利な機能についても押さえておきましょう。

YAMLとJSONを相互に変換する (to json)

YAMLとJSONは構造が似ており、Web APIとの連携などで相互に変換したい場面があります。
Rubyでは json ライブラリと組み合わせることで簡単に実現できます。

YAML to JSON

require 'yaml'
require 'json'

yaml_str = <<~YAML
  id: 101
  title: "Ruby Guide"
YAML

# 一度RubyのハッシュにしてからJSONに変換
data = YAML.safe_load(yaml_str)
json_str = data.to_json

puts json_str
# => {"id":101,"title":"Ruby Guide"}

よくあるエラーと対処法 (h not found / SyntaxError)

YAML操作中によくあるトラブルと対処法です。

Psych::SyntaxError
YAMLのフォーマットが不正な場合に発生します。
インデント(スペースの数)がずれていないか、タブ文字を使っていないか(YAMLはタブ禁止)を確認してください。

yaml.h not found
Rubyのインストール時(rbenv install など)に発生することが多いエラーです。
システムに libyaml がインストールされていないことが原因ですので、OSに応じたライブラリをインストールしてからRubyを再ビルドしてください。

RailsプロジェクトでのYAML読み込み

Ruby on Railsでは、YAMLをより便利に扱うための仕組みが用意されています。

config/ 以下のYAMLファイル内で、<%= ENV['API_KEY'] %> のようにERB(埋め込みRuby)を使いたい場合は、以下のように記述してパースします。

# ERBを評価してからYAMLとして読み込む
config = YAML.load(ERB.new(File.read('config/custom.yml')).result)

また、config_for メソッドを使えば、環境ごと(development, productionなど)の設定を自動で切り替えてハッシュとして取得できるため、Rails開発ではこちらを積極的に活用しましょう。

Rubyのスキルを活かして年収を上げる方法

以上、RubyのYAMLについて解説してきました。

なお、Rubyのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなRubyの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。