为什么rails试图连接到mysql?

我一直在新的rails应用程序中使用mysql,但现在我想尝试mongoDB,所以我安装了mongo mapper和mongoid(使用mongo session)。 安装似乎很好,因为我可以创建mongo模型。 但由于某些原因,rails仍在尝试连接到mysql: Can't connect to local MySQL server

这太可怕了,因为即使我没有使用mongo,rails也不应该为每个请求尝试连接到mysql。 即使对于不存在的URL,它也会抛出该错误。

我该怎么做才能调试这个? 我想我可以尝试从Gemfile中删除mysql gem并运行bundle install 。 但即使我不使用它,我仍然不喜欢它试图连接的事实。 它不应该尝试连接’懒惰’(即:仅按需)?

development.rb:

 Myapp::Application.configure do # Settings specified here will take precedence over those in config/application.rb # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false # Log error messages when you accidentally call methods on nil. config.whiny_nils = true # Show full error reports and disable caching config.consider_all_requests_local = true config.action_controller.perform_caching = false # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false # Print deprecation notices to the Rails logger config.active_support.deprecation = :log # Only use best-standards-support built into browsers config.action_dispatch.best_standards_support = :builtin # Raise exception on mass assignment protection for Active Record models config.active_record.mass_assignment_sanitizer = :strict # Log the query plan for queries taking more than this (works # with SQLite, MySQL, and PostgreSQL) config.active_record.auto_explain_threshold_in_seconds = 0.5 # Do not compress assets config.assets.compress = false # Expands the lines which load the assets config.assets.debug = true end 

application.rb中:

 require File.expand_path('../boot', __FILE__) require 'rails/all' if defined?(Bundler) # If you precompile assets before deploying to production, use this line Bundler.require(*Rails.groups(:assets => %w(development test))) # If you want your assets lazily compiled in production, use this line # Bundler.require(:default, :assets, Rails.env) end module Myapp class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/extras) # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] # Activate observers that should always be running. # config.active_record.observers = :cacher, :garbage_collector, :forum_observer # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] # Use SQL instead of Active Record's schema dumper when creating the database. # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql # Enforce whitelist mode for mass assignment. # This will create an empty whitelist of attributes available for mass-assignment for all models # in your app. As such, your models will need to explicitly whitelist or blacklist accessible # parameters by using an attr_accessible or attr_protected declaration. # config.active_record.whitelist_attributes = true # Enable the asset pipeline config.assets.enabled = true # Version of your assets, change this if you want to expire all your assets config.assets.version = '1.0' config.generators do |g| g.orm :mongo_mapper end end end 

当ActiveRecord是应用程序的一部分时,它会尝试在启动时建立与数据库的连接。 如果连接失败,应用程序将无法启动。

问题出在这里:

 require 'rails/all' 

该行包括所有“常用”rails组件,其中包括ActiveRecord。 如果你去定义它,它应该是这样的(对于rails 3.2):

 require "rails" %w( active_record action_controller action_mailer active_resource rails/test_unit sprockets ).each do |framework| begin require "#{framework}/railtie" rescue LoadError end end 

拿这个代码,删除active_record行,然后把它放到你的rails/all行。 现在,ActiveRecord未包含在内,当您在代码中看到ActiveRecord引用时,您的应用程序将大声失败,如下所示:

 config.active_record.mass_assignment_sanitizer = :strict 

你也需要删除它们。 您不需要删除database.yml,但您可能应该删除它,因为它现在没有任何意义。

您需要删除配置activerecord的行:

 # Raise exception on mass assignment protection for Active Record models config.active_record.mass_assignment_sanitizer = :strict # Log the query plan for queries taking more than this (works # with SQLite, MySQL, and PostgreSQL) config.active_record.auto_explain_threshold_in_seconds = 0.5 

我假设你已经检查了你的database.yml,以确保没有找到adapter: mysql

此外,如果你在你的Gemfile中留下了mysql,那么mysql gem会爆炸,因为它无法做到这一点,因此必须作为依赖项失败。 删除它+重新运行。