你太复杂了。
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 %>