应用报 undefined method for nil 怎么查
现象#
自建应用在 OAuth 回调里抛 NoMethodError: undefined method 'shop' for nil:NilClass,浏览器停在 500 页,堆栈指向读取 session 的那一行。
原因#
- 回调请求没带上有效 session,session 对象为 nil,后续取字段自然炸掉
- 应用起了多实例却没共享 session 存储,授权请求与回调落到不同实例
- cookie 的 SameSite 设为 Lax 或 Strict,嵌入式 iframe 的跨站回调不带 cookie
- 中间件顺序错了,鉴权逻辑排在 session 初始化之前执行
处理步骤#
- 在回调入口打印
params[:shop]与session[:shopify],看哪个为空 - 把 session 落到 Redis 等外部存储,并在
shopify_app.rb里指向同一实例 - 嵌入式场景把 cookie 改成
SameSite=None; Secure,同时保留 state 校验 - 确认
EnsureInstalled一类中间件排在 session 初始化之后 - 对 nil 分支显式处理:回跳
/auth?shop=...重新授权,别继续往下跑
验收标准#
从店铺后台点开应用能走完授权并落到首页,日志里不再出现 NoMethodError,每个请求的 session[:shopify] 都有值。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。