如果我的头衔有点不清楚,请原谅我;我试图让它尽可能通用。
我有一个模型User
,一个ChatRoom
模型和一个ChatRoomUser
模型(没有控制器)。 User
通过has_many
与ChatRoom
建立ChatRoomUser
关系,反之亦然。
我想制作一条允许用户离开其中一个聊天室的路线;我在UsersController
:
def leave
@chosen = ChatRoom.find(params[:chat_room_id])
if @chosen.nil?
redirect_back(fallback_location: chat_room_path(@chosen))
end
current_user.chat_rooms.remove(@chosen)
# If there are no users left in the room, destroy it.
if(!@chosen.users.any?)
@chosen.destroy
end
redirect_to chat_rooms_path
end
我认为没关系。但我不清楚如何正确设置这条路线。我的路线文件中有:
delete '/users/chat_room/:chat_room_id', to: 'users#leave'
但我不知道如何在html.erb文件中引用它。我试过<%= link_to users_chat_room_path(@chatroom), method: :delete %>
但没有骰子。
我是否应该为ChatRoomUsers创建一个控制器并在其上创建一个destroy方法来处理它?我不知道这是不错的做法(只为一种方法制作一个控制器)。
提前感谢您的帮助。
答案 0 :(得分:1)
路由可以像这样给出自定义名称:
delete '/users/chat_room/:chat_room_id',
to: 'users#leave',
as: :leave_room
现在它可以leave_room_path
。
我是否应该为ChatRoomUsers创建一个控制器并在其上创建一个destroy方法来处理它?我不知道这是不错的做法(只为一种方法制作一个控制器)。
这就是REST倡导者会告诉你的事情。只有一种方法的控制器并不是一种糟糕的做法。膨胀你的控制器 - 这是不好的做法。控制器应该尽可能的瘦。
答案 1 :(得分:1)
添加如何以REST的方式执行此操作,并且在删除的对象为chat_room_user
时,:id
上唯一的参数为chat_room
:
在路线中,筑巢资源&#39;在chat_room
下chat_room_user
。
resources :chat_room do
resource :chat_room_user, :only => [:create, :delete]
end
然后在chat_room_users
控制器
def create
@chat_room = ChatRoom.find_by_id(params[:chat_room_id])
# current_user join a chat room
end
def delete
@chat_room = ChatRoom.find_by_id(params[:chat_room_id])
# current_user leave a chat room
end
在视图中,您将此路线称为chat_room_chat_room_user_path(@chat_room)
并添加方法::method => :delete
或:method => :post
。