2013-04-19 2 views
2

У меня есть модель Notification. В целом, эта модель неважна и предназначена для уведомления пользователя. У меня нет причин хранить эти данные.Уничтожьте все действия контроллера в рельсах

Пользователь может очищать свои уведомления один за другим через AJAX, и эта часть работает нормально.

Я хочу дать пользователю опцию «Удалить все». Как в центре уведомлений Android.

Это лучший способ сделать это действием контроллера клиента? Или я бы использовал контроллер удаления и передал идентификатор пользователя и какой-то флаг для удаления всех?

ответ

2

Я бы разместил сообщение в destroy_all_notifications_path без каких-либо идентификаторов, а на контроллере уничтожить все уведомления зарегистрированного пользователя.

+0

Я всегда был ожесточен в отношении действий с пользовательскими контроллерами, некоторые люди говорят, что это неправильный способ сделать что-то. Но это действительно прекрасно? – dewyze

+0

@JDewzy вы должны использовать пользовательское действие контроллера, если вы не находитесь в контроллере REST, т. Е. Вы должны использовать другое, а не показывать, удалять, обновлять и т. Д. Это ваш случай. – pierallard

+0

@JDewzy Вы должны следовать маршрутам RESTfull, когда это возможно, в противном случае создайте собственные маршруты. EDIT: oops, duplicated – fotanus

1

Вы должны объявить новое действие в контроллере Извещение:

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) %> 
+0

Это действительно не должно существовать как под-маршрут «пользователей».Нет причин, по которым пользователю когда-либо понадобится отправить обратно на другой маршрут пользователя. Он должен * всегда * быть зарегистрированным пользователем, чьи уведомления затронуты. – meagar

+0

Это поведение полезно для некоторых администраторов ... Вам просто нужно проверить, является ли @user current_user или current_user является администратором. – pierallard

1

Недавно я наткнулся на это сам и вот как я решил это. Поэтому, прежде всего, сбор пользовательских уведомлений может быть смоделирован как ресурс RESTful. Однако этот ресурс не может иметь идентификатор, а также пользователь может иметь только один набор уведомлений, а не много. Вот почему я бы моделировать это как сингулярного ресурс, как это:

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 
Смежные вопросы