2012-11-16 3 views
3

레일즈 3 애플리케이션에서 GoCardless API로 작업하고 있습니다. 원격 레코드의 ID와 일치하는 resource_id 열이있는 구독 모델이 있습니다.레일스에서 ​​로컬 데이터와 API 데이터 결합

API에서 로컬 구독 레코드에 대한 추가 정보를 얻으려고합니다.

구독 인덱스보기

<% @subscriptions.each do |subscription| %> 
    <tr> 
    <td><%= subscription.resource_id %></td> 
    <td><%= subscription.resource_type %></td> 
    <td><%= subscription.signature %></td> 
    <td><%= subscription.state %></td> 
    <td><%= @gocardless.next_interval_start %></td> 
    <td><%= link_to 'Show', subscription %></td> 
    <td><%= link_to 'Edit', edit_subscription_path(subscription) %></td> 
    <td><%= link_to 'Destroy', subscription, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

구독 컨트롤러

def index 
@subscriptions = Subscription.all 
@gocardless = GoCardless::Merchant.find("XXXXXXXXXX").subscriptions 

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @subscriptions } 
end 
end 

당신은 내가 다음 간격 시작 날짜

<%= @gocardless.next_interval_start %> 
를 검색하기 위해 다음 줄을 사용하고 볼 수 있듯이

이것은 작동하지 않으며 nil을 리턴합니다. 그러나 다음과 같이 변경하면 모든 레코드가 API의 첫 번째 레코드 값을 표시합니다.

<%= @gocardless.first.next_interval_start %> 

는 GoCardless의 API documentation에 따르면 다음과 같은 사용하여 구독을 조회 할 수 있습니다

GoCardless::Subscription.find("XXXXXXXXXX") # => #<GoCardless::Subscription ...> 

그래서, 내 질문에. 로컬 구독 레코드 각각에 대해 next_internal_start 값을 볼 수 있도록 현재 구독 resource_id를 API에 전달하려면 어떻게해야합니까?

업데이트

내가 GoCardless에서 404 응답을 아래 아담의 예를 사용. 나는 요청에 상인 ID를 설정하지 않기 때문이라고 생각합니다. 내가하는 방법을 변경하는 경우 :

def gc_subscription 
    @gc_subscription ||= GoCardless::Merchant.find("MERCHANTID").subscriptions.find(self.resource_id) 
end 

을 나는 어떤 속성에 대해 나는 시도하고 요청은 다음 코드를 사용하여`#에 대한 undefined method 간격을 '얻을 :

<% for subscription in @subscriptions %> 
<%= subscription.gc_subscription.amount 
<% end %> 

로컬 콘텐츠를 얻기 위해 동일한 코드를 사용하여 예상대로 작동합니다.

<% for subscription in @subscriptions %> 
<%= subscription.resource_id %> 
<% end %> 

검색하려는 값이 API에서 사용 가능한지 확인했습니다.

<%= subscription.gc_subscription.first.amount %> 

이 처음 가입의 값을 2.5를 반환 첫 번째 결과를 호출하기 전에으로 https://sandbox.gocardless.com/docs/api_guide#resources-available

업데이트 두

아담의 방법을 사용하여 작동합니다.

답변

2

나는 원격 개체에 대한 액세스를 제공 내 구독 모델에이 같은 방법을했을 원격 데이터 소스에 연결된 로컬 구독 모델이 있다면 :

def gc_subscription 
    @gc_subscription ||= GoCardless::Subscription.find(self.resource_id) 
end 

그런 다음이 방법에 액세스 할 수 있습니다 필요에 따라 뷰 또는 컨트롤러에서 GC 로직을 사용할 필요가 없습니다. 예를 들면 :

for subscription in @subscriptions 
    subscription.gc_subscription.some_method #=> "output" 
end 

하나만 가입 작업하는 경우 또는 : 그것으로

subscription = Subscription.find(id) 
subscription     #=> Your local Subscription instance 
subscription.gc_subscription #=> GoCardless::Subscription instance 

처럼 구성, 당신은 당신의 컨트롤러에서 @gocardless를 제거하고보기를 대체 할 수있을 것입니다 여기에 :

<% @subscriptions.each do |subscription| %> 
    <tr> 
    <td><%= subscription.resource_id %></td> 
    <td><%= subscription.resource_type %></td> 
    <td><%= subscription.signature %></td> 
    <td><%= subscription.state %></td> 
    <td><%= subscription.gc_subscription.next_interval_start %></td> 
    <td><%= link_to 'Show', subscription %></td> 
    <td><%= link_to 'Edit', edit_subscription_path(subscription) %></td> 
    <td><%= link_to 'Destroy', subscription, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

나는 희망한다.

+0

많은 구독으로 추가하면 꽤 느려질 것입니다. 단일 요청으로 API에 모든 데이터를 검색하는 것이 더 효율적입니다. – RocketR

+0

감사합니다. Adam. 나는 아직도 조금 혼란 스럽다. 구독 모델에이 메서드를 추가하고 GC 논리를 컨트롤러에서 제거했습니다. 인덱스보기에서 나는 <% @ subscriptions.each do | subscription | %>'를 호출 한 다음'<% = subscription.gc_subscription.next_interval_start %>'를 호출합니다. 하지만 404 오류가 발생합니다. 구독 테이블에 유효한 resource_id가 하나만 있는지 확인했습니다. 컨트롤러에'subscription = Subscription.find (id)'가 있어야합니까? – dannymcc

+0

가맹점 ID를 설정하지 않았기 때문에 404 일 수 있다고 생각합니다. – dannymcc

관련 문제