2012-07-11 109 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实例。