【问题标题】:If Model A has_many Instances of B, through another model C, how might I make a route to destroy an instance of B on a particular instance of A?如果模型 A 有 B 的多个实例,通过另一个模型 C,我如何制定路线以在 A 的特定实例上销毁 B 的实例?
【发布时间】:2017-06-16 19:38:07
【问题描述】:

如果我的标题有点不清楚,请原谅我;我试图使其尽可能通用。

我有一个模型User、一个ChatRoom 模型和一个ChatRoomUser 模型(没有控制器)。 User 通过ChatRoomUserChatRoomhas_many 关系,反之亦然。

我想制定一条路线,让用户离开其中一个聊天室;我有处理实际离开房间的代码,在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 方法来处理这个问题?我不知道这是否是一种好习惯(为单一方法制作控制器)。

提前感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby routing


    【解决方案1】:

    可以像这样为路由指定自定义名称:

    delete '/users/chat_room/:chat_room_id', 
           to: 'users#leave',
           as: :leave_room
    

    现在可以使用leave_room_path

    我是否应该为 ChatRoomUsers 创建一个控制器并在其上创建一个 destroy 方法来处理这个问题?我不知道这是否是一种好习惯(只为单一方法制作控制器)。

    这就是 REST 倡导者会告诉你的。仅用于一种方法的控制器并不是一个坏习惯。膨胀你的控制器 - 这是不好的做法。控制器应该尽可能瘦。

    【讨论】:

      【解决方案2】:

      添加到您如何以 RESTful 方式执行此操作,并且给定您要删除的对象是 chat_room_user 并且唯一的参数是 chat_room 上的 :id

      在路由中,在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

      【讨论】:

        猜你喜欢
        • 2016-12-25
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        相关资源
        最近更新 更多