1

我正在创建一个 RESTful API,供 n+ 个客户端通过 HTTP 使用。

如果我有一个 Users <= Friendships => Friends 多对多关系,我是否应该满意为了删除任何用户的友谊,我首先必须查询 GET Friendships#index 以获取友谊的 ID我打算删除,然后发出删除请求?

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

为了让用户删除好友关系,应用程序需要提供好友关系“id”,但为了让用户知道他们正在删除哪个好友,他们需要查看好友“名称”。

换句话说,是否有一种 RESTful 方式在同一个 HTTP 请求中请求 Friend 模型数组及其各自的 Friendship 模型数组?

以下是我当前的设置:

# 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,但这个问题代表任何框架。是的,我知道我有一百万种方法可以“完成”,但我正在寻找 RESTful 方式来做到这一点,这样我就可以使用任何客户端框架,而不必过多地自定义 I/O .

4

1 回答 1

1

我认为您不需要发出两个单独的请求。我认为,如果您处于只知道 user_id 和 follower_id 的位置,您可以在 Friendship 模型中实现一个查找器,以根据 user_id 和friend_id 查找友谊,然后删除找到的那个。不过,我认为如果您想走纯粹的宁静方式,最好在显示友谊关系时拉出friendship.id服务器端。在sample_app 的 Rails 教程代码库中有一个很好的例子来说明如何做到这一点。在这里,连接模型称为关系,并且有一个具有创建和销毁操作的关系控制器。用于处理销毁操作的表单位于 /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 %>

在这里,用户模型上有一个 has_many :relationships,然后它使用 ActiveRecord 中的 find_by_followed_id 动态查找器返回要删除的特定关系对象。这似乎是最 RESTful 的方式。

于 2012-06-01T18:16:14.683 回答