您好我正在尝试将webhook添加到使用shopify gem创建的shopify应用中。
直到现在一切正常。在我的webhook_controller中,我有一个连接到商店的前置过滤器: before_filter:connect_to_store
def product_new
data = ActiveSupport::JSON.decode(request.body.read)
shopify_id = data["id"]
Product.new_from_shopify(@s, shopify_id)
head :ok
end
private
def connect_to_store
shop_url = request.headers['HTTP_X_SHOPIFY_SHOP_DOMAIN']
shop_url = ("http://" + shop_url)
@s = Shop.find_by_url(shop_url)
session = ShopifyAPI::Session.new(@s.url, @s.access_token)
session.valid?
ShopifyAPI::Base.activate_session(session)
end
通过这种方式,我可以轻松访问产品模型中的Shopify API:
def self.new_from_shopify(shop, shopify_id)
shopify_p = ShopifyAPI::Product.find(shopify_id)
# creates the local product
local_p = Product.new
local_p.shopify_id = shopify_p.id
local_p.name = shopify_p.title
local_p.shop = shop
local_p.save
end
到目前为止一切顺利。
问题是当我尝试将delayed_job添加到混音中时。 如果我试着改变
Product.new_from_shopify(@s, shopify_id)
到
Product.delay.new_from_shopify(@s, shopify_id)
然后,延迟的作业无法再访问Shopify API连接并给我一个错误。
在这种情况下,最佳做法是什么?
更新
一种可能的解决方案是在我的Shop模型中创建一个新方法:
def connect_to_store
session = ShopifyAPI::Session.new(self.url, self.access_token)
session.valid?
ShopifyAPI::Base.activate_session(session)
end
然后在我的产品模型操作中调用此方法。
答案 0 :(得分:1)
由于这是一个将在控制器范围之外执行的作业,因此它必须知道如何在没有此方法的情况下连接到shopify API。
最佳解决方案是提取将Shopify api连接设置为控制器和延迟作业均可访问的单独模块的代码。
答案 1 :(得分:0)
我在这里建议的方法也适用于求职者:https://stackoverflow.com/a/11445727/1440757