我有一个Notification
模型。总而言之,这个模型并不重要,只是为了通知用户。我没有理由保留这些数据。
用户可以通过AJAX一一清除通知,该部分工作正常。
我想给用户一个“全部删除”选项。很像 Android 的通知中心。
执行此操作的最佳方法是客户控制器操作吗?或者我会使用删除控制器并传递用户 ID 和某种标志来删除所有?
我有一个Notification
模型。总而言之,这个模型并不重要,只是为了通知用户。我没有理由保留这些数据。
用户可以通过AJAX一一清除通知,该部分工作正常。
我想给用户一个“全部删除”选项。很像 Android 的通知中心。
执行此操作的最佳方法是客户控制器操作吗?或者我会使用删除控制器并传递用户 ID 和某种标志来删除所有?
我会在destroy_all_notifications_path
没有任何 id 的情况下发布,并在控制器上销毁登录用户的所有通知。
您应该在 Notification 控制器中声明一个新操作:
def destroy_all
@user.notifications.each(&:destroy)
end
然后将其添加到您的路线
map.resources :users do |user|
user.resources :notifications, :collection => { :destroy_all => :delete }
end
不要忘记检查 @user 是否为 current_user !
在您看来,使用链接来销毁。
<%= link_to_remote :destroy_all_notifications_user_path(current_user) %>
最近我自己偶然发现了这个,这就是我解决这个问题的方法。所以首先,用户通知的集合可以建模为一个 RESTful 资源。但是,此资源不能有 id,并且用户只能拥有一个通知集合,而不是很多。这就是为什么我会将其建模为这样的单一资源:
resources :user do
resource :notifications, only: :destroy
end
这会给我 RESTful 路线DELETE /users/:user_id/notifications
。现在,问题在于,默认情况下,Rails 会将此路由分配给NotificationsController#destroy
. 由于您已经将此操作分配给销毁单个通知,因此您必须为资源“user_notifications”创建一个单独的控制器。
我会在下面创建一个文件夹users
,app/controllers
并在其中创建notifications_controller.rb
. 然后在这个控制器中,我将执行该destroy
操作。最后,在路由中,我需要像这样指定控制器:
resources :user do
resource :notifications, only: :destroy, controller: 'users/notifications'
end