2012-11-16 34 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

相关问题