Techioz Blog

/rails/config/database.yml の解析中に YAML 構文エラーが発生し続ける

概要

Pop!_OS 22.04 LTS コンピューターで作業しています。本当に助けが必要なんです。 Ruby on Rails は初めてです。 docker で postresql を使用して Rails 7.1.0 アプリを構築しています。 Ruby 3.2.2 (2023-03-30 リビジョン e51014f9c0) [x86_64-linux] および psql (PostgreSQL) 16.0 (Ubuntu 16.0-1.pgdg22.04+1) がインストールされています。 コマンド「docker-compose build」を実行すると、コンパイルプロセスはすべてうまくいきました。

しかし、docker-compose up を実行しようとすると、bin/rails が中止されましたと表示され続けます。 /rails/config/database.yml の解析中に YAML 構文エラーが発生しました。 YAML はスペースを使用して一貫してインデントする必要があることに注意してください。タブは使用できません。エラー: (): 行 14 列 13 で次のトークンをスキャン中に、トークンを開始できない文字が見つかりました

試してみたことがあります。

「docker-compose build」でアプリをビルドした後。ターミナルで「docker-compose up」コマンドを実行しました。ブラウザの「localhost:3000」アドレスでアプリを起動できるように、docker でサーバーを起動することを期待していました。しかし、私はその逆を受け取りました。

私の端末には次のように表示されました。

sharkphonesuniverse-demo-web-1  | YAML syntax error occurred while parsing
/rails/config/database.yml. Please note that YAML must be consistently
indented using spaces. Tabs are not allowed. Error: (<unknown>): found
character that cannot start any token while scanning for the next token at
line 14 column 13

私のdatabase.ymlの内容は次のとおりです。

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= ENV['POSTGRES_HOST'] %>
  port: 5432

development:
  <<: *default
  database: sharkphonessale_development
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>

test:
  <<: *default
  database: sharkphonessale_test
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>

production:
  <<: *default
  database: <%= ENV['POSTGRES_DB'] %>
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>

.env ファイルの内容

RAILS_ENV=production
POSTGRES_HOST=db
POSTGRES_DB=demodb_production
POSTGRES_USER=my db username goes here
POSTGRES_PASSWORD=my db password goes here
RAILS_MASTER_KEY=I paste the content of my config > master.key file here

注:私はすでに、database.yml の内容が一貫してインデントされていることを確認しました。また、https://www.yamllint.com/ で、database.yml の内容もチェックしました。その内容が有効であることが示されています。しかし、依然として同じエラーメッセージが表示されます。

解決策

エラー メッセージは、行 14 列 13 に問題があることを示しています。これらのツールが行と列のカウントを 0 から開始するか 1 から開始するかは必ずしも明確ではありませんが、エラー メッセージは開発セクションの次の行を参照していると思われます。

  password: <%= ENV['POSTGRES_PASSWORD'] %>
            ^

ここで、Ruby on Rails がそのファイルをどのように処理するかを見てみるのが理にかなっています。最初にファイルを読み取り、次にそのファイル内の ERB ステートメントを処理し、ステートメントを戻り値に置き換えます。その後、最後のステップで Rails が YAML を解析します。

つまり、YAML 解析でエラーが発生した場合、生の YAML ファイルを確認する必要はありません。しかしその代わりに、ERB ステートメントが処理された後にドキュメントがどのように見えるかを理解する必要があります。

また、エラー メッセージは、ドキュメント内の <%= ENV[‘POSTGRES_PASSWORD’] %> の戻り値が始まる位置を正確に示しているため、実際に問題が ENV[‘POSTGRES_PASSWORD’ の値にあることは明らかです。 ]。

推測することしかできません。 ENV[‘POSTGRES_PASSWORD’] は空白の場合があり、処理後の行は次のようになります。

  password: 

または、存在する可能性がありますが、パスワードが YAML を無効にする文字で始まっている場合もあります。パスワードが {foo だった場合、その行は次のようになります。

  password: {foo

その結果、{ はその場所では使用できない標識文字であるため、YAML は無効になります。

この問題を解決するには: