在Rails中具有自定义操作的多态路由

时间:2017-05-22 23:24:38

标签: ruby-on-rails ruby routing

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

用户模型有has_many :chat_rooms, through: chat_room_users,而ChatRooms有has_many :users, through chat_room_users。 UsersController有一个leave操作,我想在此网址上使用此请求进行调用。

我想在我拥有的视图上创建指向此网址的链接。我已经为当前用户提供了变量@user,并为视图上的当前聊天室提供了@chosen。那么我该怎么做这个设置的link_to和路由呢?我在routes.rb文件中有delete /users/:id/chat_rooms/leave/:chat_room_id,但我该怎么做link_to?

谢谢。

1 个答案:

答案 0 :(得分:2)

你过度复杂了。

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