2

こんにちは、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

次に、製品モデルアクションでこのメソッドを呼び出します。

4

2 に答える 2

1

これはコントローラーのスコープ外で実行されるジョブであるため、このメソッドを使用せずに shopify API に接続する方法を知っている必要があります。

最善の解決策は、Shopify API 接続を設定するコードを、コントローラーと遅延ジョブの両方がアクセスできる別のモジュールに抽出することです。

于 2012-07-11T15:20:35.160 に答える
0

ここで提案したのと同じ方法が、ジョブワーカーでも機能します: https://stackoverflow.com/a/11445727/1440757

于 2012-07-12T05:57:07.810 に答える