2012-11-16 37 views
3

我正在使用Rails 3應用程序中的GoCardless API。我有一個訂閱模型,其中有一個與遠程記錄的id匹配的resource_id列。在Rails中將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 ...> 

所以,我的問題。如何將當前訂閱resource_id傳遞給API,以便我可以查看每個本地訂閱記錄的next_internal_start值?

更新

用亞當的例子下面我從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中可用。 https://sandbox.gocardless.com/docs/api_guide#resources-available

更新兩個

作爲調用的第一個結果之前使用作品亞當的方法:

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

這將返回2.5這是第一個簽約的價值。

回答

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

我認爲這可能是404,因爲我沒有設置我的商家ID。 – dannymcc

相關問題