Shopify API 调用在 Rails 后台作业中不工作

Shopify API calls not working in Rails background job

在我的 Rails 控制器操作中,我有一个执行大量 Shopify API 调用的方法。像: ShopifyAPI::Product.all()

ShopifyAPI::Product.find(:all, params: {title: title})

ShopifyAPI::Product.create(title: title, body_html: description, images: images, tags: tags, product_type: product_type)

所有这些都符合我的要求...非常整洁。

问题是我要上传 CSV 文件并使用此控制器方法。如果我有 8 个订单项,那很好,但很快就会变慢。所以,我想,让我们把它移到后台工作人员吧。

我正在使用 Redis/Resque 让一切正常进行并使用一些虚拟输出(即 puts 'Hi there champ!')我已经确认后台工作程序已正确配置并在应该的时间和地点执行.整洁

然后我将我的控制器动作的点点滴滴放入并输出。这一切都有效,直到我打了我的 Shopify API 电话。我可以对任何对象调用 .new,但是当我尝试 .find.all.create 任何有效对象时(在我将其抽象到后台之前有效)工作),它有点死了。超级描写!我已经 尝试 通过 loggerputs 输出正在发生的事情,但我似乎无法生成太多正在发生的事情的输出,但我已经隔离这归功于 Shopify API 的工作。我认为,即使我有一个指定我的密码、站点、API 密钥、秘密等的初始化程序,我可能需要根据 their setup docs here 重新初始化我的 Shopify 会话。我要么做错了,要么确实解决了问题。

此时我确定我只是遗漏了文档中的某些内容,但我无法找到如何从我的后台作业中进行这些必要的 API 调用。关于我可能做的明显错误的事情有什么想法可以解决这个问题吗?有人处理过类似的事情吗?

事实证明,这与 Shopify Engine 的安装位置有关。在我的 routes.rb 中,我有以下内容(除了其他路线;这是两个相关的路线):

mount ShopifyApp::Engine, at: '/'
root to: 'products#index'

这一切都很好,但是有点强制您的 Shopify API 调用的上下文在 products.rb 索引控制器操作的上下文中进行...没有一些更改。有 2 种方法可以做到这一点,其中一种显然是更 Railsy 的方法:

选项 1:

包括

session = ShopifyApp::SessionRepository.retrieve(1)
ShopifyAPI::Base.activate_session(session)

在您要进行 Shopify API 调用的任何文件的开头。这将设置会话(假设您只有 1 个商店,顺便说一句......这是使用检索方法检索商店 1。风险假设),向 API 进行身份验证,生活中的一切都很好。

选项 2:

Class 继承为赢。 让所有进行 API 调用的控制器继承自ShopifyApp::AuthenticatedController。这使得初始化程序真正起作用,仅此而已。这是(回想起来)清晰明了的方法。有订单控制器吗? class OrdersController < ShopifyApp::AuthenticatedController 并完成:order = ShopifyAPI::Order.find(params[:id]) 完全符合您的预期。