こんにちは、shopifygemを使用して作成したshopifyアプリにWebhookを追加しようとしています。
今まですべてが機能します。私のwebhook_controllerには、ストアに接続するbeforeフィルターがあります: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
このようにして、製品モデル内のShopifyAPIに簡単にアクセスできます。
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接続にアクセスできなくなり、エラーが発生します。
この場合のベストプラクティスは何ですか?
アップデート
考えられる解決策の1つは、ショップモデルに新しいメソッドを作成することです。
def connect_to_store
session = ShopifyAPI::Session.new(self.url, self.access_token)
session.valid?
ShopifyAPI::Base.activate_session(session)
end
次に、製品モデルアクションでこのメソッドを呼び出します。