rails полиморфные ассоциации, перенаправление в зависимости от модели, с использованием контроллера модели

#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. в этом проекте добавлены как уведомления, так и история, которые отображаются в контексте (каждый контекст зависит от того, где находится пользователь), поэтому он будет просматривать определенные уведомления и истории. если кому-то нужны подробности об этом, не стесняйтесь спрашивать.