You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:25:02