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

I keep getting YAML syntax error occurred while parsing /rails/config/database.yml

提问人:Jephry_x 提问时间:10/21/2023 最后编辑:maxJephry_x 更新时间:10/21/2023 访问量:116

问:

我真的需要一些帮助。我是 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”后,编译过程一切顺利。

但是当我尝试运行时,它一直在说! 解析 时发生 YAML 语法错误。请注意,YAML 必须始终使用空格缩进。不允许使用制表符。错误:():在第 14 行第 13 列扫描下一个标记时发现无法启动任何标记的字符docker-compose upbin/rails aborted/rails/config/database.yml

这是我尝试过的。

在我使用“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

以下是我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内容,它显示其内容是有效的。但我仍然收到相同的错误消息。

ruby-on-rails ruby postgresql docker-compose rubygems

评论

0赞 Troy 10/21/2023
查看 /rails/config/database.yml 的第 14 行第 13 列。如果您不清楚问题出在哪里,请在此处发布database.yml的内容(或至少第 14 行)。如果你不知道在哪里可以找到database.yml,你可能需要问另一个关于使用 postresql 和 docker 构建 rails 7.1.0 应用程序的问题。
0赞 max 10/21/2023
编辑。下次,为每个文件使用一个代码块,而不是一个巨大的代码块。处理 YAML 错误时的一个提示是确保编辑器使用空格而不是制表符,并显示隐藏字符,以便可以找到制表符或不间断空格。

答:

3赞 spickermann 10/21/2023 #1

错误消息指出第 14 行第 13 列中的问题。并不总是清楚这些工具是否开始计算 0 或 1 的行和列,但我想错误消息指的是本节中的这一行:development

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

现在,我们来看看 Ruby on Rails 是如何处理该文件的。首先,它读取文件,然后处理该文件中的 ERB 语句,并用它们的返回值替换这些语句,然后最后一步 Rails 解析 YAML。

这意味着,当 YAML 解析引发错误时,我们不需要查看原始 YAML 文件。但相反,我们需要了解在处理雇员再培训局的报表后,文件会是什么样子。

而且,由于错误消息指的是文档中 的返回值开始的位置,因此很明显,问题实际上出在 的值上。<%= ENV['POSTGRES_PASSWORD'] %>ENV['POSTGRES_PASSWORD']

我只能猜测。 可能是空白的,该行在处理后可能如下所示:ENV['POSTGRES_PASSWORD']

  password: 

或者它可能存在,但密码以导致 YAML 无效的字符开头。想象一下密码是 ,那么该行将如下所示:{foo

  password: {foo

因此,YAML 将无效,因为 是该位置不允许的指示符{

要解决此问题,请执行以下操作:

  • 仔细检查环境变量是否实际在开发环境中设置。POSTGRES_PASSWORD

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

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

评论

1赞 max 10/21/2023
提示:除非您不在乎 ENV var 是否为 n,否则请始终使用。它将为您节省大量的调试时间。ENV.fetch
1赞 spickermann 10/21/2023
@max很棒的提示。据我所知,像 Rubocop 这样的工具在这些情况下强制使用它们的默认配置。fetch
1赞 max 10/21/2023
我想知道如果人们只是使用 Rubocop,这里会有多少问题自行解决?
1赞 max 10/21/2023 #2

你不需要它。

Rails 中,您可以设置任何数据库设置,通过这些设置自动与 中的设置合并。ENV["DATABASE_URL"]database.yml

例如,要使用密码连接到 as,请设置为:my_hostnamebobp4sswordENV["DATABASE_URL"]

postgresql://my_hostname/my_database_name?password=p4ssword&user=bob

无需创建一堆额外的配置变量。

事实上,您实际上只需要文件中的最低限度:database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: sharkphonessale_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: sharkphonessale_test
  
# This entire configuration is provided via ENV["DATABASE_URL"]
production:
  <<: *default

在大多数情况下,这在测试和开发中与Postgres一起“开箱即用”,因为默认值不需要任何配置。然后,您所要做的就是在生产环境中设置单个 ENV var。

不要让事情变得比他们需要的更复杂。

如果您的项目使用 Docker,您也不需要 DotEnv。如果需要任何其他配置,请通过 Docker 配置或 Rails 加密凭据提供。