rails4 - Psych :: BadAlias:未知别名:test

8 capistrano ruby-on-rails

尝试使用Capistrano cap deploy部署我的项目:迁移,我在我的database.yml上的测试别名中出错(这在本地服务器上运行正常)

development:
   database: db_dev
   adapter: mysql2
   username: xxxxxx
   password: xxxxxx
   host: localhost
   encoding: utf8

test: &test
   database: db_test
   adapter: mysql2
   username: xxxxxx
   password: xxxxxx
   host: localhost
   encoding: utf8

production:
   database: db_prod
   adapter: mysql2
   username: xxxxxxxx
   password: xxxxxxx
   host: localhost
   encoding: utf8

cucumber:
   <<: *test
Run Code Online (Sandbox Code Playgroud)

控制台日志是:

           rake aborted!
   Psych::BadAlias: Unknown alias: test
   /railties-4.0.3/lib/rails/application/configuration.rb:106:in `database_configuration'
   /activerecord-4.0.3/lib/active_record/railtie.rb:175:in `block (2 levels) in <class:Railtie>'
   /activesupport-4.0.3/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval'
   /activesupport-4.0.3/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook'
   /activesupport-4.0.3/lib/active_support/lazy_load_hooks.rb:28:in `block in on_load'
   /activesupport-4.0.3/lib/active_support/lazy_load_hooks.rb:27:in `each'
   /activesupport-4.0.3/lib/active_support/lazy_load_hooks.rb:27:in `on_load'
   /activerecord-4.0.3/lib/active_record/railtie.rb:174:in `block in <class:Railtie>'
   /railties-4.0.3/lib/rails/initializable.rb:30:in `instance_exec'
   /railties-4.0.3/lib/rails/initializable.rb:30:in `run'
   /railties-4.0.3/lib/rails/initializable.rb:55:in `block in run_initializers'
   /railties-4.0.3/lib/rails/initializable.rb:54:in `run_initializers'
   /railties-4.0.3/lib/rails/application.rb:215:in `initialize!'
   /railties-4.0.3/lib/rails/railtie/configurable.rb:30:in `method_missing'
   /home/kadoudal/rails/swim-tech.eu/site/swimtech/releases/20140326140458/config/environment.rb:6:in `<top (required)>'
   /activesupport-4.0.3/lib/active_support/dependencies.rb:229:in `require'
   /activesupport-4.0.3/lib/active_support/dependencies.rb:229:in `block in require'
   /activesupport-4.0.3/lib/active_support/dependencies.rb:214:in `load_dependency'
   /activesupport-4.0.3/lib/active_support/dependencies.rb:229:in `require'
   /railties-4.0.3/lib/rails/application.rb:189:in `require_environment!'
   /railties-4.0.3/lib/rails/application.rb:250:in `block in run_tasks_blocks'
   Tasks: TOP => db:migrate => environment
Run Code Online (Sandbox Code Playgroud)

Cam*_*way 8

我不相信您可以根据您引导的环境分配测试,开发或生产别名(如果环境是生产环境,则将应用生产设置).问题是,如果这样做,黄瓜只能在测试环境中使用.

我用了类似下面的东西:

  base: &base
     adapter: mysql2
     host: address.com
     encoding: utf8
     adapter: mysql2
     username: xxxxxx
     password: xxxxxx

  development:
     database: db_dev
     <<: *base

  test:
     database: db_test
     <<: *base

  production:
     database: db_prod
     <<: *base

  cucumber:
     database: cucumber
     <<: *base
Run Code Online (Sandbox Code Playgroud)

  • 此外,原始的database.yml应该没有任何问题 - 虽然调试它有点晚.我看到这个错误的唯一原因是因为有人使用`#save_load` - 默认情况下完全禁止引用. (5认同)
  • 这个答案是不正确的。yaml 文件中的别名与 rails 的功能**无关**。它们只是加载文件时的快捷方式。无论您是否使用引用,加载文件后返回的数据看起来都相同。 (4认同)
  • 是的,`YAML.safe_load` 默认不允许使用别名。但如果 `true` 作为第四个参数传递,则可以被允许。 (3认同)
  • 我在使用“YAML.safe_load”时也遇到了这个问题 (2认同)

Rus*_*eev 6

You can avoid this problem by passing aliases: true argument to YAML.safe_load method:

YAML.safe_load(File.read('config/database.yml'), aliases: true)
Run Code Online (Sandbox Code Playgroud)