所以我正在制作聊天应用,我希望用户能够离开聊天室。这可以通过向/users/:id/chat_rooms/leave/:chat_room_id
等路线发布删除请求来完成。
用户模型有has_many :chat_rooms, through: chat_room_users
,而ChatRooms有has_many :users, through chat_room_users
。 UsersController有一个leave
操作,我想在此网址上使用此请求进行调用。
我想在我拥有的视图上创建指向此网址的链接。我已经为当前用户提供了变量@user
,并为视图上的当前聊天室提供了@chosen
。那么我该怎么做这个设置的link_to和路由呢?我在routes.rb文件中有delete /users/:id/chat_rooms/leave/:chat_room_id
,但我该怎么做link_to?
谢谢。
答案 0 :(得分:2)
你过度复杂了。
DELETE /chat_rooms/:chat_room_id/leave
不是通过URL传递用户ID,而是通过会话或令牌(如果是API应用程序)获取它。
经验法则:资源不应嵌套超过1级 深。集合可能需要由其父级确定范围,但需要具体 成员总是可以通过id直接访问,而不应该需要 作用域(除非id由于某种原因不是唯一的)。 http://weblog.jamisbuck.org/2007/2/5/nesting-resources
这只是如何解决这个问题的一个简单例子:
# routes.rb
resources :chat_rooms do
member do
post :join
delete :leave
end
end
class User
has_many :chat_room_users
has_many :chat_rooms, though: :chats
end
class ChatRoomUser
belongs_to :user
belongs_to :chatroom
end
class ChatRoom
has_many :chat_room_users
has_many :users, though: :chats
end
将其放在UsersController
中是非常值得怀疑的。我会把它放在ChatroomsController
中。
class ChatroomsController
# ...
# POST /chat_rooms/:chat_room_id/join
def join
@chat_room = ChatRoom.find(params[:id])
@chat = current_user.chat_room_users.new(chat_room: @chat_room)
if @chat_room.create
# ...
else
# ...
end
end
# DELETE /chat_rooms/:chat_room_id/leave
def leave
@chat_room = ChatRoom.find(params[:id])
@chat = current_user.chat_room_users.find_by(chat_room: @chat_room)
@chat.destroy
end
end
<%= button_to 'Join', join_chat_room_path(@chat_room), method: :post %>
<%= button_to 'Leave', leave_chat_room_path(@chat_room), method: :delete %>