如果模型A具有B的实例,通过另一个模型C,我如何在A的特定实例上创建路由来销毁B的实例?

时间:2017-06-16 19:38:08

标签: ruby-on-rails ruby routing

如果我的头衔有点不清楚,请原谅我;我试图让它尽可能通用。

我有一个模型User,一个ChatRoom模型和一个ChatRoomUser模型(没有控制器)。 User通过has_manyChatRoom建立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方法来处理它?我不知道这是不错的做法(只为一种方法制作一个控制器)。

提前感谢您的帮助。

2 个答案:

答案 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_roomchat_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