vscode运行rails失败主因是未继承终端ruby环境:需用code .启动、验证which ruby一致、禁用硬编码ruby路径、bundle exec solargraph bundle索引、rails 7+设autoloader=classic并清缓存、仅用fxn.vscode-ruby-debug+debug gem组合。

VSCode 本身不运行 Rails,它只调用你终端里已有的 ruby、bundle 和 rails —— 所以“跑不起来”或“断点进不去”的根本原因,90% 是 VSCode 没继承你的 Ruby 环境上下文。
为什么 which ruby 在终端里是对的,VSCode 里却指向 /usr/bin/ruby
双击图标或用 open -a "Visual Studio Code" . 启动时,VSCode 不加载 ~/.zshrc 或 ~/.bashrc,也就读不到 rbenv init 或 rvm reload 注入的 PATH、GEM_HOME、GEM_PATH。结果就是:你在终端能 bundle exec rails server,但 VSCode 集成终端里报 Could not find gem。
- 永远在项目根目录的终端中执行
code .(不是图形界面双击,也不是open -a) - 打开后立刻在 VSCode 集成终端里运行
echo $SHELL和which ruby,结果必须和你在外部终端里敲的一致 - 别在
.vscode/settings.json里硬写"ruby.interpreterPath"指向~/.rbenv/versions/3.2.2/bin/ruby—— 这会绕过 rbenv shim,bundle exec行为异常
bundle exec solargraph bundle 必须带 bundle exec,否则补全失效
Solargraph 要识别 form_with、belongs_to 这类动态方法,必须读取 Gemfile.lock 并索引你项目实际用到的 gems。只装 solargraph gem 不够,不走 Bundler 上下文就等于没加载 Rails。
- 确保已运行
bundle install,且Gemfile.lock存在 - 在项目根目录执行
bundle exec solargraph bundle(不是solargraph bundle) - 检查
.vscode/settings.json是否有"solargraph.useBundler": true - 若补全仍无 Rails 方法,在
.solargraph.yml中加require: ["./config/environment"]
Rails 7+ 调试必须设 config.autoloader = :classic 并清缓存
Rails 7 默认用 :zeitwerk,但 debug gem 对它的路径监听不稳定,断点常跳到错误文件、卡在 controller 不进 model。
- 在
config/environments/development.rb中加一行:config.autoloader = :classic - 改完立刻在终端执行
bin/rails tmp:clear,否则 zeitwerk 缓存还在生效 - 如果仍不进
app/models,在launch.json的env字段加"RUBY_DEBUG_NO_RAILS": "1",临时禁用 Rails 集成验证是否是 autoload 干扰
调试器只认 fxn.vscode-ruby-debug + debug gem 组合
rebornix.Ruby 插件已停更,misogi.ruby-debug-ide 在 Ruby 3.1+ 上崩溃率高。目前唯一稳定组合是 fxn.vscode-ruby-debug 插件配合 debug gem。
- 在
Gemfile里加:gem "debug", group: :development, require: false,然后bundle install - 删干净所有
binding.pry、byebug、pry-byebug—— 它们跟debug冲突,会导致断点卡死或进程假死 -
launch.json中type必须是"ruby",request是"launch",program设为"${workspaceFolder}/bin/rails",args填["server", "-p", "3000"]
最容易被忽略的是:Rails 7+ 的 zeitwerk 缓存不会因改配置自动清除,bin/rails tmp:clear 必须手动执行;还有 ERB 文件默认当 HTML 解析,得在 settings.json 里加 "files.associations": {"*.html.erb": "erb"},否则 里连语法高亮都没有。











