将API数据与Rails中的本地数据相结合

时间:2012-11-16 21:09:19

标签: ruby-on-rails-3 api controller record

我正在使用Rails 3应用程序中的GoCardless API。我有一个订阅模型,它有一个resource_id列,它匹配远程记录的id。

我正在尝试从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值?

更新

使用下面的Adam示例,我从GoCardless获得了404响应。我认为这是因为我没有在请求中设置商家ID。当我将方法更改为:

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

对于我尝试使用以下代码请求的任何属性,我得到#{1}} interval':

undefined method

使用相同的代码获取本地内容时,它按预期工作:

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

我已经检查过我尝试检索的值在API中可用。 https://sandbox.gocardless.com/docs/api_guide#resources-available

更新两个

在调用第一个结果之前使用Adam的方法:

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

这将返回2.5,这是第一个订阅的值。

1 个答案:

答案 0 :(得分: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 %>

我希望有所帮助。