【问题标题】:Polymorphic Routes with Custom Actions in RailsRails 中具有自定义操作的多态路由
【发布时间】:2017-10-22 17:46:46
【问题描述】:

所以我正在制作一个聊天应用程序,我希望用户能够离开聊天室。这可以通过向/users/:id/chat_rooms/leave/:chat_room_id 之类的路由发布删除请求来完成。

Users 模型有has_many :chat_rooms, through: chat_room_users,而 ChatRooms 有has_many :users, through chat_room_users。 UsersController 有一个 leave 操作,我想在这个 url 上使用这个请求来调用它。

我想在我拥有的视图上创建指向此 url 的链接。我已经有一个变量@user 用于当前用户,@chosen 用于视图上可用的当前聊天室。那么我将如何为这个设置做一个 link_to 和 route 呢?我在 routes.rb 文件中有 delete /users/:id/chat_rooms/leave/:chat_room_id,但是我将如何执行 link_to?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby routing


    【解决方案1】:

    你太复杂了。

    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 %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多