2017-06-16 15 views
1

所以如果我的標題有點不清楚,請原諒我;我試圖儘可能通用。如果模型A has_many B的實例,通過另一個模型C,我該如何創建一條路徑來銷燬特定A實例上的B實例?

我有一個模型UserChatRoom模型和ChatRoomUser模型(它沒有控制器)。 UserChatRoomhas_many關係,通過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([email protected]?) 
     @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製作一個控制器並在其上做一個銷燬方法來處理這個問題?我不知道這是否是一種好的做法(僅爲單一方法制作控制器)。

在此先感謝您的幫助。

回答

1

路線可以給自定義名稱是這樣的:

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

現在它可以作爲leave_room_path

我應該爲ChatRoomUsers製作一個控制器並在其上做一個銷燬方法來處理這個問題?我不知道這是否是一種好的做法(僅爲單一方法制作控制器)。

這就是REST倡導者要求你做的事情。只有一種方法的控制器並不是一個壞習慣。膨脹你的控制器 - 這是不好的做法。控制器應儘可能瘦。

1

添加到你怎麼可能做到這一點REST風格,並給予你的刪除是chat_room_user的對象,唯一的參數是:idchat_room

在路線,窩「資源」 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

相關問題