Всякий раз, когда задание cron в Rails завершается неудачно с "производственной" базой данных, не настраивается ошибка

В моем приложении Rails я использую всякий раз, когда gem для запуска задачи Sideqik. Когда я запускаю эту команду вручную в консоли rails, она работает. Но всякий раз, когда cron терпит неудачу со следующей ошибкой: он продолжает повторяться в журнале. Как я могу это исправить? В чем проблема?

/home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection': 'production' database is not configured. Available: ["development", "test"] (ActiveRecord::AdapterNotSpecified)
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:211:in `resolve_connection'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:139:in `resolve'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:169:in `spec'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_handling.rb:50:in `establish_connection'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/railtie.rb:120:in `block (2 levels) in <class:Railtie>'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:28:in `block in on_load'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:27:in `each'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:27:in `on_load'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/railtie.rb:116:in `block in <class:Railtie>'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `instance_exec'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `run'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `call'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:54:in `run_initializers'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/application.rb:352:in `initialize!'
    from /home/pubudu/Projects/istockseller/config/environment.rb:5:in `<top (required)>'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `block in require'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:92:in `preload'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:143:in `serve'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:131:in `block in run'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:125:in `loop'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:125:in `run'
    from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application/boot.rb:18:in `<top (required)>'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from -e:1:in `<main>'

1 ответ

Решение

Вы сталкиваетесь с этой ошибкой, потому что ваши производственные параметры не настроены правильно для подключения к вашей базе данных. Когда вы запускаете команду из консоли Rails, вы подключаетесь к среде разработки, но ваша задача cron выполняется в производственной среде.


Rails имеет 3 встроенных окружения. Основное отличие состоит в том, что у каждого своя база данных, но есть и другие отличия.

  • Производство, когда ваш код работает вживую. Эта среда выполняет много операций кэширования и не отображает сообщения об ошибках разработки для пользователя.
  • Разработка, для создания вашего приложения. Это среда по умолчанию и среда, в которой вы проводите большую часть своего времени.
  • Тест, для запуска автоматизированных тестов. Основная причина этого в том, что ваш набор тестов может очищать и воссоздавать базу данных при каждом запуске теста. Это делает ваши тесты более воспроизводимыми и предотвращает случайное разрушение БД разработки.

В основном они настраиваются через файлы в config/environments, Соединения с базой данных настраиваются в config/database.yml - вы найдете ключи YAML для development, production, а также test там. Руководство по Rails содержит более подробную информацию о настройке приложений.

Вы можете узнать, в какой среде вы работаете через Rails.env, Например:

user@foo $ rails c
Loading development environment (Rails 4.1.1)
irb(main):001:0> Rails.env
"development"

И вы можете заставить команду работать в данной среде через RAILS_ENV переменная среды оболочки:

user@foo $ RAILS_ENV=production rails c
Loading production environment (Rails 4.1.1)
irb(main):001:0> Rails.env
"production"

Чтобы решить вашу проблему, у вас есть два варианта:

  1. Заставьте команду cron работать в среде разработки. Похоже, ваше приложение работает в среде разработки (потому что оно работает из консоли, а у вас не настроена производственная база данных). Поэтому принудительное выполнение задания cron в среде разработки должно это исправить. Вы можете установить его в вашем cronjob напрямую, установив RAILS_ENV переменная, как мы видели выше, но всякий раз, когда вы можете указать среду в командной строке или в вашем schedule.rb:

    set :environment, "development"
    
  2. Исправьте ваше приложение для запуска в производстве. Если ваше приложение работает, оно действительно должно работать в производственной среде. Это будет быстрее и безопаснее, а также позволит вам все испортить при разработке новых функций без риска уничтожения чего-либо, используемого вашими пользователями. Вам нужно будет настроить базу данных и протестировать ваше приложение в работе. Лучший способ сделать это зависит от платформы; этот вопрос переполнения стека содержит хорошее резюме различных вариантов.

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