错误信息如下:
/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:47:in `resolve_hash_connection'
/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:41:in `resolve_string_connection'
...
/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/application.rb:103:in `require_environment!'
/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/application.rb:297:in `block (2 levels) in initialize_tasks'
/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in `eval'
/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in `<main>'
我的database.yml文件:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000
我的 gem 文件:
source 'https://rubygems.org'
gem "therubyracer"
gem "less-rails" #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
gem "twitter-bootstrap-rails"
gem 'jquery-rails'
gem 'devise'
gem 'rails', '3.2.13'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
group :development, :test do
gem 'sqlite3'
end
group :production do
gem 'pg'
end
gem 'mini_magick'
gem "rmagick"
gem "carrierwave"
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', :platforms => :ruby
gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'
# To use Jbuilder templates for JSON
# gem 'jbuilder'
# Use unicorn as the app server
# gem 'unicorn'
# Deploy with Capistrano
# gem 'capistrano'
# To use debugger
# gem 'debugger'
最佳答案
我在一个有点复杂的项目中解决了类似的问题。不确定它是否直接相关,但我将其发布为调试问题的方式可能会有所帮助。
在我的例子中,我遇到了以下情况:
- 这种情况只发生在
RAILS_ENV=production
时。当我执行RAILS_ENV=development
时,它起作用了。奇怪的是,当我将database.yml
中的production
条目更改为production2
并使用RAILS_ENV=production2
运行命令时>,它奏效了。 - 在项目中,我通过各种模型和库连接到多个数据库连接。
这是我为检测问题所做的工作:
vim/Users/davidzabner/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb
(或回溯告诉您问题所在的任何地方)。
然后,我在代码中找到了有这些行的地方:
def resolve_hash_connection(spec) # :nodoc:
spec = spec.symbolize_keys
raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
并将其更改为以下内容:
def resolve_hash_connection(spec) # :nodoc:
spec = spec.symbolize_keys
# Debug printing
puts "*" * 80, spec.inspect, "*" * 80
raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
然后我重新运行命令,在我的例子中是 bundle exec rails c production
。
通过这样做,我意识到 Rails 并没有像我想的那样寻找 production
条目。它正在寻找一个名为 abc_production
的不同条目,由于我之前提到的多个数据库连接,它在我的项目中是必需的。在该特定服务器上,有人忘记将 abc_production
条目添加到 database.yml
中。添加条目解决了问题。
我相信只有当 RAILS_ENV=production
时才会发生,因为在 environments/production.rb
中我有 config.eager_load = true
,这意味着Rails 会将应用程序和类预先加载到内存中,并可能尝试建立在这些类中定义的所有数据库连接(其中之一是 abc_production
)。
希望这对遇到类似情况的人有所帮助...如果您没有使用多个连接,请尝试通过更改 connection_specification.rb
来调试问题,看看它是否给您任何线索。
关于ruby-on-rails - Rails 数据库配置没有指定适配器。我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17579012/