Ошибка парсера yaml в Ruby и rails для database.yml

Среда Rails 3.2.14 Ruby 1.9.3p448 Пакет Ubuntu 12.04 версии 1.3.5

Существует некоторая проблема с тем, как ruby ​​1.9.3 загружает YAML. Если я высушу код в файле databse.yml, команды rails console, server, generate и т.д. не будут выполнены. Если я удаляю эти значения по умолчанию, то все работает нормально.

Я попробовал парсер психики и парсер syck. Это просто трассировка ошибок отличается в синтаксическом анализаторе, но проблема сохраняется.

Ниже приведен только пример. Фактическая конфигурация отличается. вызывает ошибку, когда database.yml что-то вроде этого:

default: &default
  host: localhost
  ...

development:
  << *default
  pool: 5
  ...

Работает совершенно нормально, когда файл database.yml выглядит примерно так:

development:
  host: localhost
  pool: 5

Ниже приведена трассировка ошибки:

/home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:246:in `block in visit_Psych_Nodes_Alias': Unknown alias: production (Psych::BadAlias)
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:246:in `fetch'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:246:in `visit_Psych_Nodes_Alias'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:15:in `visit'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:5:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:20:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:264:in `block in revive_hash'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:258:in `each'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:258:in `each_slice'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:258:in `revive_hash'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:141:in `visit_Psych_Nodes_Mapping'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/delayed_job-4.0.0/lib/delayed/psych_ext.rb:133:in `visit_Psych_Nodes_Mapping_with_class'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:15:in `visit'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:5:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:20:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:273:in `block in revive_hash'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:258:in `each'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:258:in `each_slice'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:258:in `revive_hash'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:141:in `visit_Psych_Nodes_Mapping'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/delayed_job-4.0.0/lib/delayed/psych_ext.rb:133:in `visit_Psych_Nodes_Mapping_with_class'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:15:in `visit'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:5:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:20:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:238:in `visit_Psych_Nodes_Document'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:15:in `visit'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/visitor.rb:5:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:20:in `accept'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych/nodes/node.rb:35:in `to_ruby'
    from /home/naveen/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/psych.rb:128:in `load'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/application/configuration.rb:115:in `database_configuration'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activerecord-3.2.13/lib/active_record/railtie.rb:78:in `block (2 levels) in <class:Railtie>'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:36:in `instance_eval'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:26:in `block in on_load'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:25:in `each'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/lazy_load_hooks.rb:25:in `on_load'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activerecord-3.2.13/lib/active_record/railtie.rb:74:in `block in <class:Railtie>'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/initializable.rb:30:in `instance_exec'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/initializable.rb:30:in `run'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/initializable.rb:54:in `each'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/initializable.rb:54:in `run_initializers'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/application.rb:136:in `initialize!'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/railtie/configurable.rb:30:in `method_missing'
    from /home/naveen/workspace/econveyance/EconveyancePro3/config/environment.rb:6:in `<top (required)>'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `block in require'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:236:in `load_dependency'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/application.rb:103:in `require_environment!'
    from /home/naveen/.rvm/gems/ruby-1.9.3-p448@EconveyancePro3/gems/railties-3.2.13/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

  ...

Ниже приведен полный файл database.yml. Если я раскомментирую закомментированную часть, появится эта ошибка. где как с ruby ​​1.8.7 и rails 2.3.x все работало нормально.

development: &development
  adapter: mysql2
  database: <%= $dev_main_database %>
  username: root
  password:
  timeout: 60000
  host: <%= $dev_linux_machine_name %>
  encoding: utf8

test:
  adapter: mysql2
  database: ecpmain_test
  username: root
  password:
  timeout: 60000
  host: tecpdb
  encoding: utf8

staging: &staging
  adapter: mysql2
  database: ecpmain_staging
  username: sa
  password: woofer8
  timeout: 60000
  host: <%= $staging_database_host %>
  encoding: utf8

production: &development
  adapter: mysql2
  database: <%= $dev_main_database %>
  username: root
  password:
  timeout: 60000
  host: <%= $dev_linux_machine_name %>
  encoding: utf8

# background_process_development:
#   <<: *development

# background_process_staging:
#   <<: *staging

# background_process_production:
#   <<: *production

doc_finals_development: &doc_finals_development
  adapter: mysql2
  database: <%= $dev_docs_database %>
  username: sa
  password: woofer8
  timeout: 60000
  host: <%= $dev_linux_machine_name %>
  encoding: utf8

doc_finals_test:
  adapter: mysql2
  database: ecpdocs_test
  username: sa
  password: woofer8
  timeout: 60000
  host: tecpdb
  encoding: utf8

doc_finals_staging: &doc_finals_staging
  adapter: mysql2
  database: ecpdocs_staging
  username: sa
  password: woofer8
  timeout: 60000
  host: <%= $staging_database_host %>
  encoding: utf8

doc_finals_production: &doc_finals_production
  adapter: mysql2
  database: ecpdocs_production
  username: sa
  password: nash!@w
  timeout: 60000
  host: pecpdb3
  encoding: utf8

# doc_finals_background_process_development:
#   <<: *doc_finals_development

# doc_finals_background_process_staging:
#   <<: *doc_finals_staging

# doc_finals_background_process_production:
#   <<: *doc_finals_production

logging_development: &logging_development
  adapter: mysql2
  database: <%= $dev_logging_database %>
  username: sa
  password: woofer8
  timeout: 60000
  host: <%= $dev_linux_machine_name %>
  encoding: utf8

logging_test:
  adapter: mysql2
  database: ecplogging_test
  username: sa
  password: woofer8
  timeout: 60000
  host: tecpdb
  encoding: utf8

logging_staging: &logging_staging
  adapter: mysql2
  database: ecplogging_staging
  username: sa
  password: woofer8
  timeout: 60000
  host: <%= $staging_database_host %>
  encoding: utf8

logging_production: &logging_production
  adapter: mysql2
  database: ecplogging_production
  username: sa
  password: nash!@w
  timeout: 60000
  host: pecpdb3
  encoding: utf8

# logging_background_process_development:
#   <<: *logging_development

# logging_background_process_staging:
#   <<: *logging_staging

# logging_background_process_production:
#   <<: *logging_production

3 ответа

Я не вижу проблем с синтаксисом у вас там. Похоже, что опубликованная вами ошибка указывает на то, что вы по ошибке сделали это где-то:

development:
  << *production
  pool: 5

Можете ли вы опубликовать полный database.yml файл, в котором есть проблема? Отредактируйте его столько, сколько вам нужно, но я думаю, что проблема кроется где-то в данных, которые не были опубликованы.

РЕДАКТИРОВАТЬ

Я был прав, вы пытались заставить производство наследовать от несуществующего блока:

production: &development
  ...

Я не пытался это проверить, но может случиться так, что YAML-парсер ruby ​​1.8 больше прощает подобные ошибки.

В любом случае, я продолжил и высушил этот файл для вас и убедился, что он анализируется правильно:

defaults: &defaults
  adapter: mysql2
  username: root
  password:
  timeout: 60000
  encoding: utf8

development: &development
  <<: *defaults
  database: <%= $dev_main_database %>
  host: <%= $dev_linux_machine_name %>

test:
  <<: *defaults
  host: tecpdb
  database: ecpmain_test

staging: &staging
  <<: *defaults
  database: ecpmain_staging
  username: sa
  password: woofer8
  host: <%= $staging_database_host %>

production: &production
  <<: *defaults
  database: <%= $dev_main_database %>
  host: <%= $dev_linux_machine_name %>

background_process_development:
  <<: *development

background_process_staging:
  <<: *staging

background_process_production:
  <<: *production

doc_finals_defaults: &doc_finals_defaults
  adapter: mysql2
  username: sa
  password: woofer8
  timeout: 60000
  encoding: utf8

doc_finals_development: &doc_finals_development
  <<: *doc_finals_defaults
  database: <%= $dev_docs_database %>
  host: <%= $dev_linux_machine_name %>

doc_finals_test:
  <<: *doc_finals_defaults
  database: ecpdocs_test
  host: tecpdb

doc_finals_staging: &doc_finals_staging
  <<: *doc_finals_defaults
  adapter: mysql2
  database: ecpdocs_staging
  host: <%= $staging_database_host %>

doc_finals_production: &doc_finals_production
  <<: *doc_finals_defaults
  database: ecpdocs_production
  username: sa
  password: nash!@w
  host: pecpdb3

doc_finals_background_process_development:
  <<: *doc_finals_development

doc_finals_background_process_staging:
  <<: *doc_finals_staging

doc_finals_background_process_production:
  <<: *doc_finals_production

logging_defaults: &logging_defaults
  adapter: mysql2
  username: sa
  password: woofer8
  timeout: 60000
  encoding: utf8

logging_development: &logging_development
  <<: *logging_defaults
  database: <%= $dev_logging_database %>
  host: <%= $dev_linux_machine_name %>

logging_test:
  <<: *logging_defaults
  database: ecplogging_test
  host: tecpdb

logging_staging: &logging_staging
  <<: *logging_defaults
  database: ecplogging_staging
  host: <%= $staging_database_host %>

logging_production: &logging_production
  <<: *logging_defaults
  database: ecplogging_production
  username: sa
  password: nash!@w
  host: pecpdb3

logging_background_process_development:
  <<: *logging_development

logging_background_process_staging:
  <<: *logging_staging

logging_background_process_production:
  <<: *logging_production

Я был использовать defaultsПроблема была решена.

Я получал ту же ошибку, но неверный псевдоним был для developmentвместо production

Я решил проблему, прокомментировав следующие строки в моем config/webpack.ymlфайл

оптимизация:
<<: *развитие

Другие вопросы по тегам