在我正在处理的应用程序中,我需要安装一个通知系统。
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 isn&#39; ta解决方案,因为我需要许多不同的重定向相同的模型,不仅仅是节目)。 使用polymorphic_path或url,也不提供不同的重定向,只定义前缀帮助。
我需要更明确的内容,例如让我们采用两种不同类型的通知,即请求被提交的通知,因此点击它将重定向到请求本身,但是当请求完成时用户将被重定向到他的仪表板。
我不想重定向到notifications_controller并在模型上测试,然后再次测试通知类型,我希望这里的多态可以帮助。有没有办法在控制器模型中调用方法(从多态关联中检测模型)
并谢谢
答案 0 :(得分:0)
我最终在通知模型中添加了一个属性,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时利用了poymorphic。 因此,我在每个模型中定义了一个名为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
这样,我得到了我需要的重定向,使用多态关联而不添加不需要的路由。