Rails5.2升级至6.1后PostGISDatabaseTasks变量未定义错误求助
问题:Rails 5.2升级至6.1后Docker启动时PostGISDatabaseTasks报错
核心错误
undefined local variable or method `configuration' for #<ActiveRecord::ConnectionAdapters::PostGIS::PostGISDatabaseTasks:0x0000555b2c8f5ac0> Did you mean? configuration_hash
完整错误栈
wait-for-it.sh: postgresql:5432 is available after 0 seconds undefined local variable or method `configuration' for #<ActiveRecord::ConnectionAdapters::PostGIS::PostGISDatabaseTasks:0x0000555b2c8f5ac0> Did you mean? configuration_hash Couldn't create 'app' database. Please check your configuration. rake aborted! NameError: undefined local variable or method `configuration' for #<ActiveRecord::ConnectionAdapters::PostGIS::PostGISDatabaseTasks:0x0000555b2c8f5ac0> Did you mean? configuration_hash /bundle/ruby/2.7.0/gems/activerecord-postgis-adapter-6.0.1/lib/active_record/connection_adapters/postgis/postgis_database_tasks.rb:99:in `ensure_installation_configs' /bundle/ruby/2.7.0/gems/activerecord-postgis-adapter-6.0.1/lib/active_record/connection_adapters/postgis/postgis_database_tasks.rb:9:in `initialize' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:487:in `new' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:487:in `database_adapter_for' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:133:in `create' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:193:in `block in create_current' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:506:in `block (2 levels) in each_current_configuration' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:503:in `each' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:503:in `block in each_current_configuration' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:502:in `each' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:502:in `each_current_configuration' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:193:in `create_current' /bundle/ruby/2.7.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:45:in `block (2 levels) in <top (required)>' /bundle/ruby/2.7.0/gems/bugsnag-6.24.2/lib/bugsnag/integrations/rake.rb:20:in `execute' /bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:58:in `load' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:58:in `kernel_load' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:23:in `run' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/cli.rb:491:in `exec' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/cli.rb:34:in `dispatch' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/cli.rb:28:in `start' /usr/local/bundle/gems/bundler-2.4.6/exe/bundle:45:in `block in <top (required)>' /usr/local/bundle/gems/bundler-2.4.6/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors' /usr/local/bundle/gems/bundler-2.4.6/exe/bundle:33:in `<top (required)>' /usr/local/bundle/bin/bundle:23:in `load' /usr/local/bundle/bin/bundle:23:in `<main>'
当前Gemfile配置
source 'https://rubygems.org' ruby '~> 2.7' gem 'pg', '~> 1.2', '>= 1.2.3' gem 'rails', '~> 6.1.7' , '>= 6.1.7.1' gem 'responders', '~> 3.0', '>= 3.0.1' gem 'actionpack-action_caching', '~> 1.2', '>= 1.2.1' gem 'activerecord-postgis-adapter', '~> 6.0', '>= 6.0.1' gem 'addressfinder' gem 'aws-sdk-s3' gem 'aws-sdk-dynamodb' gem 'bugsnag' gem 'cancan' gem 'clearance', '~> 2.5.0' gem 'coffee-rails' gem 'dynamic_form' gem 'easy_reference_data', '~> 1.1' gem 'ejs', '~> 1.0.0' gem 'friendly_id' gem 'jquery-rails', '~> 4.4' gem 'mapkit' gem 'mime-types', require: 'mime/types' gem 'newrelic_rpm' gem 'nokogiri', '>= 1.13.2' gem 'paperclip' gem 'puma', '>= 5.6.2' gem 'rails_12factor' gem 'rgeo', '~> 2.2' gem 'rgeo-geojson', '~> 2.1', '>= 2.1.1' gem 'rinku', '~> 1.5.1', require: 'rails_rinku' gem 'sass-rails' gem 'therubyracer' gem 'uglifier', '>= 1.0.3' gem 'will_paginate' gem "whenever", "~> 1.0" gem "net-http" gem 'uri', '0.12.0' group :foreman do gem 'foreman' end group :test do gem 'database_cleaner', '~> 1.99.0' gem 'factory_bot_rails' gem 'guard-minitest' gem 'guard-rspec', require: false gem 'minitest' gem 'mocha', require: false gem 'shoulda' end group :development, :test do gem 'bundler-audit' gem 'byebug' gem 'license_finder' gem 'pry' gem 'pry-nav' gem 'pry-remote' gem 'rails-controller-testing' gem 'rspec-rails', '~> 3.8' end
解决方案
1. 升级activerecord-postgis-adapter版本
当前使用的activerecord-postgis-adapter 6.0.1仅适配Rails 6.0,与Rails 6.1的数据库任务API不兼容。Rails 6.1中数据库任务类的configuration变量被替换为configuration_hash,旧版本adapter仍在调用configuration导致报错。
修改Gemfile中的adapter版本为适配Rails 6.1的版本:
gem 'activerecord-postgis-adapter', '~> 6.1'
2. 重新构建Docker镜像并启动
Gemfile修改后,需重新安装依赖并构建镜像:
docker compose build docker compose up
3. 验证数据库创建
若之前数据库创建失败,可手动执行初始化命令确认问题解决:
docker compose run web bundle exec rake db:create db:migrate
内容的提问来源于stack exchange,提问作者Y.H
相关产品推荐
相关产品推荐

