3

Rails 3 アプリケーションで GoCardless API を使用しています。リモート レコードの ID と一致する resource_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 のドキュメントによると、次を使用してサブスクリプションを検索できます。

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

それで、私の質問です。各ローカル サブスクリプション レコードの next_internal_start 値を表示できるように、現在のサブスクリプション resource_id を API に渡すにはどうすればよいですか?

アップデート

以下の Adam の例を使用すると、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

アップデート 2

最初の結果を呼び出す前と同様に、Adam の方法を使用して動作します。

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

これは、最初のサブスクリプションの値である 2.5 を返します。

4

1 に答える 1

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

または、1 つのサブスクリプションのみを使用している場合:

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 %>

それが役立つことを願っています。

于 2012-11-17T10:41:04.777 に答える