#ruby-on-rails #ruby #redirect #polymorphic-associations
#ruby-on-rails #ruby #перенаправление #полиморфные ассоциации
Вопрос:
в приложении, над которым я работаю, мне нужно установить систему уведомлений.
class Notification < ActiveRecord::Base
belongs_to :notifiable, polymorphic: true
end
class Request < ActiveRecord::Base
has_many :notifications, as: :notifiable
end
class Document < ActiveRecord::Base
has_many :notifications, as: :notifiable
end
после создания уведомления должны перенаправляться в разные представления в зависимости от типа уведомления, поэтому это может быть для одной и той же модели и разных перенаправлений (поэтому redirect_to notification.notifiable не является решением, поскольку мне нужно много разных перенаправлений для той же модели, а не только для показа).
работая с polymorphic_path или URL, также не дают разных перенаправлений, только определенные помощники префикса.
что мне нужно более явно, например, давайте возьмем два разных типа уведомлений, тот, в котором отправляется запрос, поэтому нажатие на него перенаправит на сам запрос, но когда запрос будет выполнен, пользователь будет перенаправлен на его панель мониторинга.
я не хочу перенаправлять на notifications_controller и тестировать на модели, а затем снова тестировать тип уведомления, я надеюсь, что полиморфизм здесь может помочь. есть ли способ вызвать метод в модели контроллера (модель определяется из полиморфной ассоциации)
и спасибо
Комментарии:
1. «есть ли способ вызвать метод в модели контроллера». Как насчет: @notification.notifiable.is_a? (Запрос)
2. У меня проблемы с вашей терминологией. Нажатие на что-либо не «перенаправляет на запрос», но я думаю, что вы, возможно, слишком привязаны к тому, чтобы ничего не делать в notifications_controller независимо. Можете ли вы описать более конкретные шаги для того, что вы хотели бы видеть?
Ответ №1:
в итоге я добавил атрибут к модели уведомлений message_type : integer. После нажатия на уведомление перенаправление всегда будет одинаковым: на метод в NotificationController (redirect_notification), теперь уведомление известно, также зависимая модель тоже (из полиморфного отношения). в NotificationController :
def redirect_notification
notification =Notification.find(params[:id]) // here i get the notification
notification.notifiable.get_notification_path(notification.message_type)
end
мы используем преимущества пойм-морфики при использовании notification.notifiable.
Итак, я определяю метод с именем get_notification_path(message_type) в каждой модели, у которой есть полиморфная связь с уведомлениями, в качестве примера :
class Document < ActiveRecord::Base
has_many :notifications, as: :notifiable
def get_notification_path(message_type)
if message_type == 0
"/documents"// this is just an example, here you can put any redirection you want, you can include url_helpers.
elsif message_type == 1
url_for user_path
end
end
end
Таким образом, я получаю перенаправление, которое мне нужно, используя полиморфные ассоциации и без добавления ненужных маршрутов.
Комментарии:
1. в этом проекте добавлены как уведомления, так и история, которые отображаются в контексте (каждый контекст зависит от того, где находится пользователь), поэтому он будет просматривать определенные уведомления и истории. если кому-то нужны подробности об этом, не стесняйтесь спрашивать.