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
任何有效对象时(在我将其抽象到后台之前有效)工作),它有点死了。超级描写!我已经 尝试 通过 logger
和 puts
输出正在发生的事情,但我似乎无法生成太多正在发生的事情的输出,但我已经隔离这归功于 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])
完全符合您的预期。
在我的 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
任何有效对象时(在我将其抽象到后台之前有效)工作),它有点死了。超级描写!我已经 尝试 通过 logger
和 puts
输出正在发生的事情,但我似乎无法生成太多正在发生的事情的输出,但我已经隔离这归功于 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])
完全符合您的预期。