2012-07-11 58 views
2

嗨我在Shopify應用程序中使用Shopify創業板,我正在尋找關於如何處理與Shopify API連接的建議。如何使用Shopify gem處理Shopify API連接?

我使用的webhooks和delayed_jobs,所以我需要一種方式來打開控制器之外的連接。

在我加入這個方法我店模式的時刻:

def connect_to_store 
    session = ShopifyAPI::Session.new(self.url, self.access_token) 
    session.valid? 
    ShopifyAPI::Base.activate_session(session) 
end 

這樣我就可以很輕鬆的打開連接,例如:

Shop.find(1).connect_to_store 
ShopifyAPI::Shop.current.name 

的問題是,我的產品裏面模塊,我需要在幾種方法中打開連接,但最終我多次調用connect_to_store方法,並且擔心打開多個連接到同一商店,而沒有真正的需要。

有沒有辦法檢查連接是否已經打開,只有在找不到另一個連接時纔打開連接?

感謝, 奧古斯托

------------------- -----------------更新 -

我更好地解釋我的問題。

假設在我的產品模型中,我想查看給定產品的compare_at_price是否大於其價格,並且在這種情況下,我想向Shopify產品添加「銷售」標籤。

在我的產品型號,我有:

class Product < ActiveRecord::Base 
belongs_to :shop 

def get_from_shopify 
    self.shop.connect_to_store 
    @shopify_p = ShopifyAPI::Product.find(self.shopify_id) 
end 

def add_tag(tag) 
    @shopify_p = self.get_from_shopify 

    shopify_p_tags = shopify_p.tags.split(",") 
    shopify_p_tags.collect{|x| x.strip!} 

    unless shopify_p_tags.include?(tag) 
    shopify_p_tags << tag 
    shopify_p_tags.join(",") 

    shopify_p.tags = shopify_p_tags 
    shopify_p.save 
    end 
end 


def on_sale? 
    @shopify_p = self.get_from_shopify 
    sale = false 

    shopify_p.variants.each do |v| 
    unless v.compare_at_price.nil? 
     if v.compare_at_price > v.price 
     sale = true 
     end 
    end 
    end 

    return sale 
end 

def update_sale_tag 
    if self.on_sale? 
    self.add_tag("sale") 
    end 
end 

end 

我的問題是,如果我稱之爲:

p.update_sale_tag 

的Shop.connect_to_store被稱爲幾次,我驗證了幾次,而我已經過身份驗證。

你會如何重構這段代碼?

回答

4

我通過存儲由Shopify與商店返回的OAuth令牌來解決此問題(無論如何您都應該這樣做)。所有您需要訪問API是令牌,所以在你的店鋪模型,你必須像一個方法:

def shopify_api_path 
    "https://#{Rails.configuration.shopify_api_key}:#{self.shopify_token}@#{self.shopify_domain}/admin" 
end 

然後,如果你要訪問的API爲特定的商店在延遲作業的工人,你會簡單地說:

begin 
    ShopifyAPI::Base.site = shop.shopify_api_path 
    # Make whatever calls to the API that you want here. 
    products = ShopifyAPI::Product.all 
ensure 
    ShopifyAPI::Base.site = nil 
end 

希望這會有所幫助。我發現在控制器之外的Sessions工作有點麻煩,特別是因爲這很好很容易。

+0

這聽起來不錯!我不知道我應該在哪裏放置「開始...確保」代碼。 – Augusto 2012-07-12 05:58:37

+0

我不知道我明白什麼是「ShopifyAPI :: Base」類?爲什麼你將.site屬性設置爲零後?我知道這是非常基本的,但我仍然不明白:( – Augusto 2012-07-12 16:19:37

0

我想這裏有一些誤解。你知道你真的只是使用Active Resource來處理你所有的API工作嗎?因此,當您進行身份驗證時,您可能正在驗證會話?而且一旦通過驗證,無論您實際使用API​​多少次,您實際上都不打開「新」連接。

如果您經常在單個會話中進行身份驗證以進行多個API調用,那麼您做錯了。

如果您恰好位於沒有身份驗證的代碼塊中(例如您的應用程序可能會處理來自N個商店的WebHook)或延遲作業,只需將myshopify_domain字符串傳遞給這些代碼塊,查找商店在你的數據庫中,找到認證令牌,進行認證(一次)......然後離開你去......這真的很簡單。

+0

感謝大衛,你有我的問題的重點:我不應該多次驗證,以便進行單個API調用。 我該怎麼做?爲了更好地解釋我的問題,我添加了更多代碼。 – Augusto 2012-07-11 21:58:22

0

一旦您的應用程序驗證過一次,您可以保留該計算的密碼 - 這是很好的,直到該特定商店的應用程序被卸載爲止。

換言之,當商家首次安裝應用程序時,只需進行身份驗證,將密碼保存到數據庫,並在需要時加載它。您的self.shop.connect_to_store調用應該只設置ShopifyAPI :: Session實例。