2012-07-11 5 views
2

안녕하세요 저는 Shopify 응용 프로그램에서 Shopify 보석을 사용하고 있으며 Shopify에 대한 API 연결을 처리하는 방법에 대한 제안을 찾고 있습니다.Shopify 보석을 사용하여 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 메서드를 여러 번 호출하면 결국 실제 필요없이 같은 저장소에 여러 연결을 열지 걱정됩니다.

연결이 이미 열려 있는지 확인하고 다른 연결을 찾을 수없는 경우에만 새 연결을 열 수 있습니까?

감사합니다, 아우

------------------- UPDATE ----------------- -

문제점을 더 잘 설명합니다.

내 제품 모델에서 특정 제품의 가격이 compare_at_price보다 높고이 경우 Shopify 제품에 "판매"태그를 추가하고 싶습니다. 내 제품 모델에서

내가 가진 :

p.update_sale_tag 

을 Shop.connect_to_store 여러 번 호출되고 난 동안 여러 번 인증 :

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 

내 문제는 내가 호출하는 경우이다 이미 인증되었습니다.

어떻게이 코드를 리팩토링합니까?

답변

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 

바라기를 바랍니다. 컨트롤러 외부의 세션에서 작업하는 것이 약간 지저분한 것으로 나타났습니다. 특히 쉽고 간단합니다.

+0

큰 소리가 난다! 어디에서 "시작 ... 보장"코드를 넣어야하는지 이해하지 못했습니다. – Augusto

+0

나는 "ShopifyAPI :: Base"클래스가 무엇인지 이해하고 있는지 잘 모르겠다. 왜 .site 속성을 nil로 설정합니까? 나는 이것이 매우 기초적이라는 것을 알고 있지만 나는 아직도 그것을 얻지 못한다 :( – Augusto

0

여기에 약간의 오해가 있다고 생각합니다. 모든 API 작업에 Active Resource를 사용하고 있다는 것을 알고 있습니까? 따라서 인증 할 때 세션을 인증하는 것입니까? 일단 인증을 받으면 아무리 많은 API를 실제로 사용해도 "새로운"연결을 실제로 열지는 못합니다.

둘 이상의 API 호출을 수행하기 위해 단일 세션에서 계속해서 인증을받는 경우 잘못 수행하고 있습니다.

인증이없는 코드 블록 (예 : App이 N 개의 상점에서 WebHook을 처리 할 수 ​​있음) 또는 지연된 작업에있을 경우 해당 코드 블록에 myshopify_domain 문자열을 전달하고 상점을 검색합니다 귀하의 DB에, 인증 토큰을 찾아 인증 (한 번) ... 멀리 당신이 간다 ... 정말 간단합니다.

+0

감사합니다. David, 내 질문에 대한 답을 얻었습니다. 하나의 API 호출을 만들기 위해 두 번 이상 인증하면 안됩니다. 어떻게하면됩니까? 내 문제를 더 잘 설명하기 위해 몇 가지 코드를 추가했습니다. – Augusto

0

응용 프로그램이 일단 인증되면 해당 계산 된 암호를 보유 할 수 있습니다. 응용 프로그램이 해당 특정 저장소에 대해 제거 될 때까지 양호합니다.

즉, 판매자가 처음 앱을 설치할 때 한 번만 인증하고 비밀번호를 db에 저장 한 다음 필요할 때마다로드하십시오. 그러면 self.shop.connect_to_store 호출은 ShopifyAPI :: Session 인스턴스를 설정해야합니다.