提问人:Jephry_x 提问时间:10/21/2023 最后编辑:maxJephry_x 更新时间:10/21/2023 访问量:116
我在解析 /rails/config/database.yml 时不断出现 YAML 语法错误
I keep getting YAML syntax error occurred while parsing /rails/config/database.yml
问:
我真的需要一些帮助。我是 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 up
bin/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内容,它显示其内容是有效的。但我仍然收到相同的错误消息。
答:
错误消息指出第 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'] %>"
评论
ENV.fetch
fetch
你不需要它。
在 Rails 中,您可以设置任何数据库设置,通过这些设置自动与 中的设置合并。ENV["DATABASE_URL"]
database.yml
例如,要使用密码连接到 as,请设置为:my_hostname
bob
p4ssword
ENV["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 加密凭据提供。
上一个:PostgreSQL 在轨道上
评论