【Rails】YAMLの基本的な書き方についてと活用法

# Railsのymlファイルの書き方と小技あれこれ
YAML は、`YAML Ain't Markup Language` の略で、データの表現や設定を行うためのフォーマットとして広く使われています。(直訳すると「YAMLはマークアップ言語ではない」)
今回は、そんなRailsのYAMLファイルの書き方について、初心者向けにわかりやすく解説していきたいと思います。

# 目次
* [YAMLの基本的な書き方](#yamlの基本的な書き方)
* [RailsでのYAMLの利用方法](#railsでのyamlの利用方法)
* [YAMLが大活躍するFixturesの小技](#yamlが大活躍するfixturesの小技)
* [まとめ](#まとめ)

# YAMLの基本的な書き方
`.yml`ファイルは、人間にとって読み書きしやすい形式で構成されており
コツを掴むと驚くほど捗ります。

:::note
書き方ガイド
1. [コメント](#1-コメント)
2. [キーと値](#2-キーと値)
3. [マップ（ハッシュ）](#3-マップハッシュ)
4. [リスト（配列）](#4-リスト配列)
5. [インデントとネスト](#5-インデントとネスト)
6. [文字列](#6-文字列)
7. [フロート、整数、真偽値、ヌル](#7-フロート整数真偽値ヌル)
8. [インクルード（マージ）](#8-インクルードマージ)
:::

### 1. コメント
YAMLでは`#`記号を使ってコメントを記述できます。
コメントは行の先頭に書かれ、その行の後にあるデータとは別に扱われますので、特に記号で挟んだりすること無く`#`の行の後ろがコメントアウトします。
```.yml
# これはコメントです
key: value # この'#'の後ろもコメントです
```

### 2. キーと値
YAMLはコロン`:`を使ってキーと値を区切ったペアでデータを表現します。
キーと値は半角スペースやタブで区切ります。
```.yml
# key: value
name: John Doe
age: 30
```

### 3. マップ（ハッシュ）
マップはキーと値の組み合わせを複数持つことができるデータ構造で、インデントを使って表現します。
```.yml
person:
  name: Alice
  age: 25
```

### 4. リスト（配列）
リストは順序を持つ値の集合を表現するためのデータ構造で、ハイフン`-`で表現されます。
```.yml
fruits:
  - apple
  - banana
  - orange
```

### 5. インデントとネスト
YAMLではインデントを使ってデータの階層構造を表現します。
※インデントはスペース2つやスペース4つ、またはタブを使用できますが、混在しないように統一することが重要です。
```.yml
person:
  name: Bob
  age: 40
  contacts:
    email: bob@example.com
    phone: '123-456-7890'
```

### 6. 文字列
シングルクォート `' '` もしくはダブルクォート `" "` で文字列を表現できます。
ダブルクォート内ではエスケープ文字や変数の展開も可能です。
```.yml
message: 'Hello, world!'
greeting: "Hi, #{name}!"
```

### 7. フロート、整数、真偽値、ヌル
数値や真偽値（true, false）、ヌル値（null）も表現できます。
```.yml
price: 19.99
quantity: 5
enabled: true
disabled: false
empty_value: null
```

### 8. インクルード（マージ）
YAMLでは、あるデータセットを別のデータセットに組み込むことができる機能があり、これによってデータの再利用性と保守性を高めることができます。

例えば、以下のようなベースデータがあるとします。
```.yml
base_data:
  name: Alice
  age: 30
```
このベースデータを別のデータセットで再利用する場合、次のように記述できます。
```.yml
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)
多言語化など、主に言語ごとのテキストを管理するために使用される。
``` .yml
# config/locales/en.yml
en:
  hello: Hello, World!

# config/locales/ja.yml
ja:
  hello: ハロー、ワールド!
```

Viewファイル内でローカライズしたテキストを表示する際は`t('')`にキーまでのパスを記述して表現します。
``` .erb
<%= t('hello') %>
```
``` .haml
= t('hello')
```
※HAMLについても詳しく解説してますので是非こちらもチェックしてみてください

https://qiita.com/mine_slj/items/ea78796b19048ad0dfc7


### アプリケーションの設定ファイル (config/*.yml)
アプリケーションの設定情報を管理するために使用される。
``` .yml
# config/application.yml
development:
  api_key: 'your_api_key'
  max_items: 10
```
``` .rb
# Railsアプリケーション内で設定を使用
api_key = Rails.application.config_for(:application)['api_key']

```

### テストデータ （test/fixtures/*.yml）

``` .yml
# test/fixtures/users.yml
one:
  name: John
  email: john@example.com

two:
  name: Jane
  email: jane@example.com

```

テストを書く際には`(:キー)`の形で使用する。
``` .rb
# 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は、テストデータをテストケースに読み込む仕組みです。
簡単にデータを用意できるため、テストの効率化に一役買っています。

``` .yml
# test/fixtures/users.yml
one:
  name: John
  email: john@example.com

two:
  name: Bob
  email: bob@example.com
```

### エイリアスの活用方法
Fixtures内でエイリアスを使用することで、関連するデータを簡単に参照できます。
``` .rb
# models/user.rb
class User
    has_many :orders
end

# models/order.rb
class Order
    belongs_to :user
end
```

``` .yml
# test/fixtures/users.yml
user_john:
  name: John
  email: john@example.com

user_jane:
  name: Jane
  email: jane@example.com
```
ここで、ordersのuserフィールドにエイリアスを使用して関連ユーザーを参照することができます。
``` .yml
# test/fixtures/orders.yml
one:
  user: user_john
  total_amount: 100

two:
  user: user_jane
  total_amount: 200
```

### Rubyコードを埋め込む方法
erb形式を使用することで、動的なデータ生成や条件付きのテストデータ設定が可能です。
``` .yml
# test/fixtures/users.yml
<% 5.times do |i| %>
user_<%= i %>:
  name: User<%= i %>
  email: user<%= i %>@example.com
<% end %>
```
上記の例では、ループを使用して複数のユーザーデータを生成しています。

# まとめ
この記事では、YAMLの基本的な記述方法から小技や、RailsのミニテストでFixturesを効果的に活用する方法について解説してきました。
データの管理やテストの簡素化を目指して効率的YAMLを活用みてください。