использовать неопределенный метод `[]’ для nil: NilClass

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

Я только что установил приложение Rails 3.1 на свой сервер развертывания.

Когда я попытался запустить

 sudo rake db:setup RAILS_ENV=“production”
  

Я получил сообщение об ошибке, в котором говорится

 rake aborted!
undefined method `[]' for nil:NilClass
  

С помощью —trace он говорит:

 ** Invoke db:setup (first_time)  
** Invoke db:create (first_time)  
** Invoke db:load_config (first_time)  
** Invoke rails_env (first_time)  
** Execute rails_env  
** Execute db:load_config  
** Execute db:create  
rake aborted!  
undefined method '[]' for nil:NilClass  
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/railties/databases.rake:74:in 'rescue in create_database'  
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/railties/databases.rake:54:in 'create_database'  
/usr/local/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/railties/databases.rake:44:in 'block (2 levels) in <top (required)>'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:205:in 'call'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:205:in 'block in execute'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:200:in 'each'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:200:in 'execute'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:158:in 'block in invoke_with_call_chain'  
/usr/local/lib/ruby/1.9.1/monitor.rb:201:in 'mon_synchronize'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:151:in 'invoke_with_call_chain'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:176:in 'block in invoke_prerequisites'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:174:in 'each'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:174:in 'invoke_prerequisites'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:157:in 'block in invoke_with_call_chain'  
/usr/local/lib/ruby/1.9.1/monitor.rb:201:in 'mon_synchronize'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:151:in 'invoke_with_call_chain'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:144:in 'invoke'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:112:in 'invoke_task'    
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in 'block (2 levels) in top_level'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in 'each'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in 'block in top_level'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:129:in 'standard_exception_handling'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:84:in 'top_level'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:62:in 'block in run'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:129:in 'standard_exception_handling'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:59:in 'run'  
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.9.2/bin/rake:32:in '<top (required)>'  
/usr/local/bin/rake:19:in 'load'  
/usr/local/bin/rake:19:in '<main>'  
Tasks: TOP => db:setup => db:create  
  

В моем database.yml написано

 production:
adapter: mysql2  
    encoding: utf8  
    reconnect: false  
    database: t_production  
    pool: 5  
    username: deploy  
    password: V  
    host: localhost  
  

Существует только 1 миграция, и в ней говорится следующее:

     class CreateDeals < ActiveRecord::Migration  
  def change  
    create_table :deals do |t|  
      t.string :title  
      t.text :description  
      t.string :image_url  
      t.decimal :price, :precision => 8, :scale => 2  
t.timestamps  
    end  
  end  
end  
  

Что я должен попытаться исправить это? Я даже не уверен, с чего начать.

Ответ №1:

Вы должны исправить свое утверждение, двойные кавычки неверны. Они должны быть обычными " кавычками. Вероятно, он пытается загрузить параметр для “production” среды, которого, очевидно, не существует.

Если вы используете правильные кавычки, убедитесь, что ваша идентификация верна, определение должно выглядеть примерно так:

 production:
    adapter: mysql2  
    encoding: utf8  
    reconnect: false  
    database: t_production  
    pool: 5  
    username: deploy  
    password: V  
    host: localhost  
  

Комментарии:

1. Просто попытался изменить кавычки на стандартные двойные кавычки. Также пробовал с одинарными кавычками и без кавычек и все равно получил то же сообщение об ошибке.

2. Спасибо! Проблемой был отступ. Я не понимал, что yaml имеет значительный отступ. Я также обновил рейк.

3. YAML — это язык разметки, похожий на haml. Там, где html делает это с помощью тегов, yaml и haml используют отступ для указания вложенности.

4. @Femaref Это было потрясающе! Вы должны добавить его в свой ответ, это была именно та проблема, с которой я столкнулся! Большое спасибо!