rails多态关联,重定向取决于模型,使用模型的控制器

时间:2016-10-19 09:15:17

标签: ruby-on-rails ruby redirect polymorphic-associations

在我正在处理的应用程序中,我需要安装一个通知系统。

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并在模型上测试,然后再次测试通知类型,我希望这里的多态可以帮助。有没有办法在控制器模型中调用方法(从多态关联中检测模型)

并谢谢

1 个答案:

答案 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

这样,我得到了我需要的重定向,使用多态关联而不添加不需要的路由。