ruby /rails/config/database.yml解析时出现YAML语法错误

zpqajqem  于 2023-11-18  发布在  Ruby
关注(0)|答案(2)|浏览(197)

我真的需要一些帮助。我是Ruby on Rails的新手。我正在使用postresql和docker构建一个rails 7.1.0应用程序。我正在Pop!_OS 22.04 LTS计算机上工作,安装了ruby 3.2.2(2023-03-30 revision e51014 f9 c 0)[x86_64-Linux]和psql(PostgreSQL)16.0(Ubuntu 16.0-1.pgdg22.04 +1)。在我运行命令“docker-compose build”后,编译过程一切顺利。
但是当我尝试运行docker-compose up时,它一直说bin/rails aborted!解析/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

字符串
以下是我的数据库.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内容,它显示它的内容是有效的。但我仍然得到相同的错误消息。

aurhwmvo

aurhwmvo1#

错误消息告诉问题在 line 14 column 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'] %>"

92dk7w1h

92dk7w1h2#

你不需要它。
在Rails中,您可以通过ENV["DATABASE_URL"]设置任何数据库设置,它会自动与database.yml中的设置合并。
例如,要以bob的身份使用密码p4ssword连接到my_hostname,您可以将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加密凭证提供。

相关问题