如何修复Ruby(Sinatra)框架中的数据库迁移错误?
Sinatra + ActiveRecord迁移报错:无法加载rack/showexceptions和sinatra-activerecord
我是Ruby编程新手,正在用Sinatra框架开发简单MVC应用。执行命令rake db:create_migration NAME=Create_users创建数据库迁移时,触发LoadError,提示无法加载rack/showexceptions和sinatra-activerecord文件,报错堆栈信息如下:
LoadError: 无法加载指定文件 -- rack/showexceptions <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:73:in `require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:73:in `rescue in block in require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:51:in `block in require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:44:in `each' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:44:in `require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler.rb:187:in `require' C:/Users/ACER/Desktop/Programming practice/Ruby practice/JTasks_app/config/environment.rb:2:in `<top (required)>' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' C:/Users/ACER/Desktop/Programming practice/Ruby practice/JTasks_app/rakefile:1:in `<top (required)>' 导致错误的原因: LoadError: 无法加载指定文件 -- sinatra-activerecord C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:60:in `require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:60:in `block (2 levels) in require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:55:in `each' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:55:in `block in require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:44:in `require' C:/Users/ACER/.local/share/gem/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler.rb:187:in `require' C:/Users/ACER/Desktop/Programming practice/Ruby practice/JTasks_app/config/environment.rb:2:in `<top (required)>' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' <internal:C:/Ruby32-x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require' C:/Users/ACER/Desktop/Programming practice/Ruby practice/JTasks_app/rakefile:1:in `<top (required)>' (执行任务时添加 --trace 参数查看完整调用栈)
我的Gemfile内容如下:
source "https://rubygems.org" gem 'sqlite3' gem 'rake' gem 'activerecord' gem 'sinatra-activerecord' gem 'pry' gem 'require_all' gem 'shotgun' gem 'faker' gem 'rack', '~> 3.0.7'
解决步骤
- 确保依赖安装完整:执行
bundle install,确认所有Gemfile中声明的依赖都被正确安装,重点检查sinatra-activerecord和指定版本的rack。 - 修复Rack版本兼容性:Rack 3.x已移除
rack/showexceptions模块,而旧版sinatra-activerecord可能依赖该模块。将Gemfile中的gem 'rack', '~> 3.0.7'修改为gem 'rack', '~> 2.2.8',之后重新执行bundle install。 - 通过Bundler执行命令:使用
bundle exec rake db:create_migration NAME=Create_users代替直接运行rake,确保使用Gemfile指定的依赖版本,避免全局Gem冲突。 - 检查环境配置文件:确认
config/environment.rb开头包含以下代码,确保Bundler正确加载所有依赖:require 'bundler/setup' Bundler.require
内容的提问来源于stack exchange,提问作者Amazing
相关产品推荐
相关产品推荐

