Ruby on rails 销毁rails中的所有控制器操作

Ruby on rails 销毁rails中的所有控制器操作,ruby-on-rails,controller,Ruby On Rails,Controller,我有一个通知模型。总之,这个模型并不重要,只是通知用户。我没有理由保留这些数据 用户可以通过AJAX一个接一个地清除他们的通知,这一部分工作正常 我想给用户一个“全部删除”选项。很像Android的通知中心 这样做的最佳方式是客户控制者的行动吗?或者我会使用delete控制器并传递用户id和某种类型的delete all标志吗?我会在中发布销毁所有通知的路径,没有任何id,然后在控制器上销毁登录用户的所有通知。我会在销毁所有通知的路径中发布,没有任何id,并在控制器上销毁已登录用户的所有通知。您

我有一个
通知
模型。总之,这个模型并不重要,只是通知用户。我没有理由保留这些数据

用户可以通过AJAX一个接一个地清除他们的通知,这一部分工作正常

我想给用户一个“全部删除”选项。很像Android的通知中心


这样做的最佳方式是客户控制者的行动吗?或者我会使用delete控制器并传递用户id和某种类型的delete all标志吗?

我会在
中发布销毁所有通知的路径
,没有任何id,然后在控制器上销毁登录用户的所有通知。

我会在
销毁所有通知的路径
中发布,没有任何id,并在控制器上销毁已登录用户的所有通知。

您应该在通知控制器中声明一个新操作:

 def destroy_all
   @user.notifications.each(&:destroy)
 end
然后将其添加到您的路线中

 map.resources :users do |user|
   user.resources :notifications, :collection => { :destroy_all => :delete }
 end
别忘了检查@user是否为当前用户

在您看来,使用链接来销毁

 <%= link_to_remote :destroy_all_notifications_user_path(current_user) %>

您应该在通知控制器中声明一个新操作:

 def destroy_all
   @user.notifications.each(&:destroy)
 end
然后将其添加到您的路线中

 map.resources :users do |user|
   user.resources :notifications, :collection => { :destroy_all => :delete }
 end
别忘了检查@user是否为当前用户

在您看来,使用链接来销毁

 <%= link_to_remote :destroy_all_notifications_user_path(current_user) %>

最近我自己偶然发现了这个问题,下面是我如何解决这个问题的。因此,首先,可以将用户通知集合建模为RESTful资源。但是,此资源不能有id,并且用户只能有一个通知集合,而不能有多个。这就是为什么我会将其建模为这样一种单一资源:

resources :user do
  resource :notifications, only: :destroy
end
resources :user do
  resource :notifications, only: :destroy, controller: 'users/notifications'
end
这将为我提供RESTful路由
DELETE/users/:user\u id/notifications
。现在,问题是,默认情况下,Rails会将此路由分配给
NotificationsController\destroy
。由于您已将此操作分配给销毁单个通知,因此必须为资源“用户通知”创建单独的控制器

我将在
app/controllers
下创建一个文件夹
users
,并在其中创建
notifications\u controller.rb
。然后在这个控制器中,我将执行
destroy
操作。最后,在路由中,我需要指定如下控制器:

resources :user do
  resource :notifications, only: :destroy
end
resources :user do
  resource :notifications, only: :destroy, controller: 'users/notifications'
end

最近我自己偶然发现了这个问题,下面是我如何解决这个问题的。因此,首先,可以将用户通知集合建模为RESTful资源。但是,此资源不能有id,并且用户只能有一个通知集合,而不能有多个。这就是为什么我会将其建模为这样一种单一资源:

resources :user do
  resource :notifications, only: :destroy
end
resources :user do
  resource :notifications, only: :destroy, controller: 'users/notifications'
end
这将为我提供RESTful路由
DELETE/users/:user\u id/notifications
。现在,问题是,默认情况下,Rails会将此路由分配给
NotificationsController\destroy
。由于您已将此操作分配给销毁单个通知,因此必须为资源“用户通知”创建单独的控制器

我将在
app/controllers
下创建一个文件夹
users
,并在其中创建
notifications\u controller.rb
。然后在这个控制器中,我将执行
destroy
操作。最后,在路由中,我需要指定如下控制器:

resources :user do
  resource :notifications, only: :destroy
end
resources :user do
  resource :notifications, only: :destroy, controller: 'users/notifications'
end

这实际上不应该作为
用户的子路由存在。用户没有理由需要发回另一个用户的销毁所有路由。它应该始终是其通知受到影响的当前登录用户。此行为对于某些管理非常有用。。。您只需检查@user是当前用户还是当前用户是管理员。这实际上不应该作为
用户的子路由存在。用户没有理由需要发回另一个用户的销毁所有路由。它应该始终是其通知受到影响的当前登录用户。此行为对于某些管理非常有用。。。你只需要检查@user是current_user还是admin。我一直对自定义控制器的操作很害羞,有些人听起来好像他们做事情的方式不正确。但这真的很好吗?@JDewzy如果您不在REST控制器中,则必须使用自定义控制器操作,即,您应该使用其他think而不是show、delete、update等。这是您的情况。@JDewzy您应该尽可能遵循RESTfull路由,否则创建自己的路由。编辑:哎呀,我看了一会儿,忘了让CanCan和CanCan一起工作。谢谢@dewyze只要您知道自己在做什么,就可以使用自定义控制器操作,但我非常喜欢REST约定,几乎从不使用自定义控制器操作。大多数情况下,自定义控制器操作实际上是屏蔽资源的正常REST操作。我对自定义控制器操作一直很害羞,有些人听起来好像他们做事情的方式不正确。但这真的很好吗?@JDewzy如果您不在REST控制器中,则必须使用自定义控制器操作,即,您应该使用其他think而不是show、delete、update等。这是您的情况。@JDewzy您应该尽可能遵循RESTfull路由,否则创建自己的路由。编辑:哎呀,我看了一会儿,忘了让CanCan和CanCan一起工作。谢谢@dewyze只要您知道自己在做什么,就可以使用自定义控制器操作,但我非常喜欢REST约定,几乎从不使用自定义控制器操作。通常,自定义控制器操作实际上是屏蔽资源的正常REST操作。