我在解析 /rails/config/database.yml 时不断出现 YAML 语法错误

问题描述 投票:0回答:1

我真的需要一些帮助。我是 Ruby on Rails 新手。我正在使用 postresql 和 docker 构建一个 Rails 7.1.0 应用程序。我正在 Pop!_OS 22.04 LTS 计算机上工作 安装了 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”。我期望使用 docker 启动服务器,以便我可以在浏览器中的“localhost:3000”地址启动应用程序。但我却得到了相反的结果。

我的终端显示以下内容:

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

**********************************************
Here is the content of my 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'] %>

**********************************************
The contents of my .env file
**********************************************
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


N.B. I already made sure that the database.yml contents are consistently indented, and I also checked my database.yml content here at https://www.yamllint.com/, and it shows its content is valid. But I still get the same error message.
ruby-on-rails ruby postgresql docker-compose rubygems
1个回答
0
投票

错误消息表明问题出现在第 14 行第 13 列。并不总是清楚这些工具是否开始计算 0 或 1 的行和列,但我猜错误消息指的是

development
部分中的这一行:

  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 将无效,因为

{
是一个 指示符,在该位置是不允许的。

要解决此问题:

  • 仔细检查

    POSTGRES_PASSWORD
    环境变量是否确实在您的开发环境中设置。

  • 检查密码是否包含需要在 YAML 中进行特殊处理的字符。或者用引号将 ERB 语句的输出括起来,如下所示:

      password: "<%= ENV['POSTGRES_PASSWORD'] %>"
    
© www.soinside.com 2019 - 2024. All rights reserved.