Railsのymlファイルの書き方と小技あれこれ
YAML は、YAML Ain't Markup Language
の略で、データの表現や設定を行うためのフォーマットとして広く使われています。(直訳すると「YAMLはマークアップ言語ではない」)
今回は、そんなRailsのYAMLファイルの書き方について、初心者向けにわかりやすく解説していきたいと思います。
目次
YAMLの基本的な書き方
.yml
ファイルは、人間にとって読み書きしやすい形式で構成されており
コツを掴むと驚くほど捗ります。
1. コメント
YAMLでは#
記号を使ってコメントを記述できます。
コメントは行の先頭に書かれ、その行の後にあるデータとは別に扱われますので、特に記号で挟んだりすること無く#
の行の後ろがコメントアウトします。
# これはコメントです
key: value # この'#'の後ろもコメントです
2. キーと値
YAMLはコロン:
を使ってキーと値を区切ったペアでデータを表現します。
キーと値は半角スペースやタブで区切ります。
# key: value
name: John Doe
age: 30
3. マップ(ハッシュ)
マップはキーと値の組み合わせを複数持つことができるデータ構造で、インデントを使って表現します。
person:
name: Alice
age: 25
4. リスト(配列)
リストは順序を持つ値の集合を表現するためのデータ構造で、ハイフン-
で表現されます。
fruits:
- apple
- banana
- orange
5. インデントとネスト
YAMLではインデントを使ってデータの階層構造を表現します。
※インデントはスペース2つやスペース4つ、またはタブを使用できますが、混在しないように統一することが重要です。
person:
name: Bob
age: 40
contacts:
email: bob@example.com
phone: '123-456-7890'
6. 文字列
シングルクォート ' '
もしくはダブルクォート " "
で文字列を表現できます。
ダブルクォート内ではエスケープ文字や変数の展開も可能です。
message: 'Hello, world!'
greeting: "Hi, #{name}!"
7. フロート、整数、真偽値、ヌル
数値や真偽値(true, false)、ヌル値(null)も表現できます。
price: 19.99
quantity: 5
enabled: true
disabled: false
empty_value: null
8. インクルード(マージ)
YAMLでは、あるデータセットを別のデータセットに組み込むことができる機能があり、これによってデータの再利用性と保守性を高めることができます。
例えば、以下のようなベースデータがあるとします。
base_data:
name: Alice
age: 30
このベースデータを別のデータセットで再利用する場合、次のように記述できます。
base_data: &base_data
name: Alice
age: 30
user_data:
<<: *base_data
email: alice@example.com
user_data の中に<<: *base_data
という行があります。これにより、user_data は base_data の内容を継承するようになります。
<<:
の後ろにはアンカー(&
で始まる名前)を使うことが出来ます。
RailsでのYAMLの利用方法
インデント、キーと値の組み合わせ、配列、コメントなどについて解説したところで、次に
YAMLファイルがどのようなものかを簡単に紹介します。
特に以下の3つのケースでの用途で登場することが多いです。
ローカライズファイル (config/locales/*.yml)
多言語化など、主に言語ごとのテキストを管理するために使用される。
# config/locales/en.yml
en:
hello: Hello, World!
# config/locales/ja.yml
ja:
hello: ハロー、ワールド!
Viewファイル内でローカライズしたテキストを表示する際はt('')
にキーまでのパスを記述して表現します。
<%= t('hello') %>
= t('hello')
※HAMLについても詳しく解説してますので是非こちらもチェックしてみてください
アプリケーションの設定ファイル (config/*.yml)
アプリケーションの設定情報を管理するために使用される。
# config/application.yml
development:
api_key: 'your_api_key'
max_items: 10
# Railsアプリケーション内で設定を使用
api_key = Rails.application.config_for(:application)['api_key']
テストデータ (test/fixtures/*.yml)
# test/fixtures/users.yml
one:
name: John
email: john@example.com
two:
name: Jane
email: jane@example.com
テストを書く際には(:キー)
の形で使用する。
# test/models/user_test.rb
class UserTest < ActiveSupport::TestCase
fixtures :users
test "user name should be present" do
user = users(:one) # users(:one)のfixturesにはnameカラムに「John」が設定されている
assert user.valid?
assert_equal "John", user.name
end
end
YAMLが大活躍するFixturesの小技
Fixturesとは
Fixturesは、テストデータをテストケースに読み込む仕組みです。
簡単にデータを用意できるため、テストの効率化に一役買っています。
# test/fixtures/users.yml
one:
name: John
email: john@example.com
two:
name: Bob
email: bob@example.com
エイリアスの活用方法
Fixtures内でエイリアスを使用することで、関連するデータを簡単に参照できます。
# models/user.rb
class User
has_many :orders
end
# models/order.rb
class Order
belongs_to :user
end
# test/fixtures/users.yml
user_john:
name: John
email: john@example.com
user_jane:
name: Jane
email: jane@example.com
ここで、ordersのuserフィールドにエイリアスを使用して関連ユーザーを参照することができます。
# test/fixtures/orders.yml
one:
user: user_john
total_amount: 100
two:
user: user_jane
total_amount: 200
Rubyコードを埋め込む方法
erb形式を使用することで、動的なデータ生成や条件付きのテストデータ設定が可能です。
# test/fixtures/users.yml
<% 5.times do |i| %>
user_<%= i %>:
name: User<%= i %>
email: user<%= i %>@example.com
<% end %>
上記の例では、ループを使用して複数のユーザーデータを生成しています。
まとめ
この記事では、YAMLの基本的な記述方法から小技や、RailsのミニテストでFixturesを効果的に活用する方法について解説してきました。
データの管理やテストの簡素化を目指して効率的YAMLを活用みてください。