Ruby on Rails Shopify应用部署正常但控制器访问报T.must TypeError错误
问题排查与解决思路
核心错误分析
从日志能提取两个关键线索:
Shop Not Found:会话中推导的店铺test-rssfeed.myshopify.com在数据库中找不到对应记录TypeError (Passed nil into T.must):shopify_api的host_scheme方法调用T.must时传入了nil,本质是Shopify Context未正确初始化,缺少必要的主机配置项
具体排查步骤
1. 验证店铺记录与会话关联
- 检查数据库中是否存在
test-rssfeed.myshopify.com对应的店铺记录:- 若不存在,重新完成应用授权安装流程,确保店铺信息正常写入数据库
- 核对会话中存储的店铺域名,确认没有拼写错误或大小写问题(Shopify店铺域名统一为小写)
2. 检查Shopify Context初始化配置
shopify_api v14+强制要求正确初始化Context,重点确认host参数。查看你的初始化文件(一般在config/initializers/shopify_api.rb):
ShopifyAPI::Context.setup( api_key: ENV["SHOPIFY_API_KEY"], api_secret_key: ENV["SHOPIFY_API_SECRET"], api_version: "2024-01", host: ENV["SHOPIFY_APP_HOST"], # 此处绝对不能为nil,必须是应用完整HTTPS域名(如https://your-app-domain.com) is_embedded: true, session_storage: ShopifyAPI::SessionStorage::ActiveRecord.new )
- 确认
SHOPIFY_APP_HOST环境变量已正确配置,值为带HTTPS前缀的完整域名(Shopify嵌入式应用要求强制HTTPS) - 若用Heroku等平台部署,通过平台命令验证环境变量是否生效,比如
heroku config:get SHOPIFY_APP_HOST
3. 排查会话处理逻辑
版本更新后可能改动了会话获取逻辑:
- 确保控制器中使用
shopify_appgem提供的current_shop或current_session方法正确获取当前店铺会话 - 若自定义了会话存储逻辑,检查是否在会话中正确存储并读取店铺域名、access token等关键信息
4. 临时调试定位nil来源
可以在报错上下文添加调试代码,精准定位传入T.must的nil值:
在控制器或初始化代码中临时加入:
# 调试用代码,部署后查看日志输出 puts "Shopify Context host: #{ShopifyAPI::Context.host.inspect}" puts "Current shop domain: #{current_shop&.shopify_domain.inspect}"
根据日志输出确认哪个值为nil,再针对性修复
常见坑点提醒
- 版本更新后,
shopify_api或shopify_appgem的Context初始化规则变更,旧配置不再兼容 - 部署时环境变量未同步,导致
host参数为nil - 店铺记录被意外删除,但会话仍保留旧的店铺域名信息
内容的提问来源于stack exchange,提问作者Artur Bobinski
相关产品推荐
相关产品推荐

