我正在创建一个RESTful API,供n +客户端通过HTTP使用。
如果我有一个用户< = Friendships =>朋友多对多的关系,我应该满意的是,为了删除任何用户的友谊,我首先要查询GET友谊#index以获取我打算删除的友谊的ID,然后发出删除请求?
GET /friendships?user_id=123&friend_id=456
=> {id:"999",user_id:"123",friend_id:"456"}
DELETE /friendships/999
=> "Friendship deleted"
为了让用户删除友谊,应用程序需要具有友谊“id”,但为了让用户知道他们正在删除哪个朋友,他们需要看到朋友“名字”。< / p>
换句话说,是否有一种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
答案 0 :(得分:1)
我认为您不需要发出两个单独的请求。我想如果你处在一个只知道user_id和follower_id的位置,你可以在友谊模型中实现一个查找器,找到基于user_id和friend_id的友谊,然后删除找到的友谊。虽然,我认为如果你想以纯粹的宁静方式去,最好在展示友谊关系时拉出friendship.id服务器端。在Rails Tutorial codebase for sample_app中有一个很好的例子。这里,连接模型称为关系,并且RelationshipsController具有create和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:关系,然后使用ActiveRecord中的find_by_followed_id动态查找器返回要删除的特定关系对象。这似乎是最RESTful的方式。