2

您好我正在尝试将 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

通过这种方式,我可以轻松访问我的 Product 模型中的 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

到现在为止还挺好。

问题是当我尝试将 delay_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

然后在我的产品模型操作中调用此方法。

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 回答