Rubyonrailsを勉強し始めて2週間が経過したわけですが、特に私が落とし穴だなと思ったymlファイルの決まり事について紹介していきます。
.ymlファイルの決まり事①データを記述する際、データ間の空白を1行以上開けてはいけない
users.ymlを使って2人目のユーザー「archer」を追加したかったのでチュートリアル通りにコードをコピペして保存。
michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>
archer:
name: Sterling Archer
email: duchess@example.gov
password_digest: <%= User.digest('password') %>
rails testをしたところ、'users' テーブルに'archer'という名前のカラムが入っていないというエラーが出ました。
table "users" has no column named "archer"
知り合いに聞いたところ、YAMLファイルと言うのは結構厳密で余分なスペース一つ入るだけで動かなくなることもあるとのこと。
記述したファイルをみてみると4行ほど空いていました。
michael:
name: Michael Example
email: michael@example.com
password_digest: <%= User.digest('password') %>
archer:
name: Sterling Archer
email: duchess@example.gov
password_digest: <%= User.digest('password') %>
間を詰めたところ無事テストが通りました。
間を2行以上開けるとデータの判別がしやすくなるのですが、流石にこれは初心者泣かせですww
チュートリアルの中でも言及して欲しい内容でした。
.ymlファイルの決まり事②default: &default
一番上のdefault: &defaultと記述をして、それぞれの環境に <<: *default
とつけてあげればデフォルトで記述したルールがそれぞれの環境に適応されます。
default: &default
pool: 5
timeout: 5000
development:
adapter: sqlite3
<<: *default
database: データベース名
test:
adapter: sqlite3
<<: *default
database: データベース名
production:
<<: *default
encoding: utf8
adapter: postgresql
port: 5432
database: データベース名
username: ユーザー名
password: パスワード
host: ホスト名
したがって、下記のようにデフォルトをadapterを sqlite3としてしまうとそれぞれの環境でpostgresqlと記述しているのにもかかわらずsplite3が優先されてしまうので注意が必要です。
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
adapter: sqlite3
<<: *default
database: データベース名
test:
adapter: sqlite3
<<: *default
database: データベース名
production:
<<: *default
encoding: utf8
adapter: postgresql
port: 5432
database: データベース名
username: ユーザー名
password: パスワード
host: ホスト名
その他のエラー
Please note that YAML must be consistently indented using spaces. Tabs are not allowed.
空白がない、あるいはインデントを使って右にコードを押しやっているのでエラーが出てます、というメッセなのでその2点をチェックしましょう。