1

HTTP 経由で n+ クライアントが使用する RESTful API を作成しています。

ユーザー <= フレンドシップ => フレンド 多対多の関係がある場合、ユーザーのフレンドシップを削除するには、最初に GET friends#index をクエリしてフレンドシップの ID を取得する必要があります。 DELETE を実行してから DELETE リクエストを発行しますか?

GET /friendships?user_id=123&friend_id=456
=> {id:"999",user_id:"123",friend_id:"456"}
DELETE /friendships/999
=> "Friendship deleted"

ユーザーがフレンドシップを削除するには、アプリケーションでフレンドシップの「ID」を使用できるようにする必要がありますが、ユーザーが削除するフレンドを知るには、フレンドの「名前」を確認する必要があります。

言い換えれば、同じ HTTP リクエストで Friend モデルの配列とそれぞれの Friendship モデルの配列を要求する RESTful な方法はありますか?

以下は私の現在の設定です:

# Models
class User < ActiveRecord::Base  
  has_many :friendships, :dependent => :destroy
  has_many :friends, :through => :friendships
  # disregard inverse for now
end

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User"
  validates_uniqueness_of :user_id, :scope => :friend_id
end


# Tables
create_table :users do |t|
  t.string :name
  t.timestamps
end

create_table :friendships do |t|
  t.integer :user_id, :null => false
  t.integer :friend_id, :null => false
  t.integer :status, :null => false, :default => 0
  t.timestamps
end

# routes.rb
resources :friendships, :only => [:create, :destroy, :index]
resources :users do
  member do
    get :friends # index-like action returning array of friends
  end
end

...そしてはい、私は何日も探していました:)

私は Rails を使用していますが、この質問は任意のフレームワークを表しています。はい、「やり遂げる」方法が無数にあることは知っていますが、I/O をあまりカスタマイズしなくてもクライアント側のフレームワークを使用できるように、これを行うための RESTful な方法を探しています。 .

4

1 に答える 1

1

2 つの別々のリクエストを発行する必要はないと思います。user_id と follower_id しか知らない立場にいた場合、Friendship モデルにファインダーを実装して、user_id と friend_id に基づいて友情を見つけ、見つかったものを削除できると思います。ただし、純粋にリラックスしたい場合は、その友情関係を表示しているときに、friendship.id サーバーサイドをプルするのが最善だと思います。Rails チュートリアル コードベースの sample_appに、これを行う方法の非常に良い例があります。ここでは、結合モデルは関係と呼ばれ、作成および破棄アクションを持つ RelationshipsController があります。destroy アクションを処理するためのフォームは /app/views/users/_unfollow.html.erb にあり、次のようになります。

<%= form_for(current_user.relationships.find_by_followed_id(@user),
             :html => { :method => :delete },
             :remote => true) do |f| %>
  <div class="actions"><%= f.submit "Unfollow" %></div>
<% end %>

ここでは、User モデルに has_many :relationships があり、ActiveRecord の find_by_followed_id 動的ファインダーを使用して、削除する特定の関係オブジェクトを返します。これは、最も RESTful な方法のようです。

于 2012-06-01T18:16:14.683 に答える