如何重构这个多态URL帮助器

时间:2013-11-15 06:05:53

标签: ruby-on-rails ruby ruby-on-rails-3 polymorphism

我有以下丑陋的帮助方法,它确定给定活动的URL。除了1种情况之外,路径生成一个带锚的问题的链接(Stack Overflow样式),它由一系列脆弱的if/else语句检索,访问可跟踪对象是评论还是答案然后分配结果传递给最后传递给url_for帮助器的变量。

关于这种情况我有2个问题:

  1. 目前的实施感觉是错误的做法。我应该在保存活动时确定这些路径并捕获数据库的路径,这样每次用户访问路径时都不必生成这些路径吗?还是有一种更难以处理的方式?

  2. 如果这是正确的道路或类似的东西,首先,我如何将其重构为更简洁的东西,并且这应该是一个类方法或辅助方法,因为它只处理一个活动的路径

  3. activity_helper.rb

    def get_activity_path(activity)
      if activity.trackable_type == "Comment"
        object = a.trackable.commentable_type == "Question" ? a.trackable.commentable : a.trackable.commentable.question
      elsif activity.trackable_type == "Answer"
        object = activity.trackable.question
      end
      activity.trackable_type == "User" ? info_path : "#{url_for(object)}##{activity.trackable_type.downcase}_#{activity.trackable.id}"
    end
    

    协会

    class Answer
      belongs_to :question, counter_cache: true
      has_many :comments, as: :commentable, dependent: :destroy
      has_many :activities, as: :trackable, dependent: :destroy
    
    class Comment
      belongs_to :commentable, polymorphic: true
      has_many :activities, as: :trackable, dependent: :destroy
    
    class Question
      has_many :comments, as: :commentable, dependent: :destroy
      has_many :answers, dependent: :destroy
    

    我正在使用rails 3.2.14,ruby 1.9.3p448和public_activity gem - https://github.com/pokonski/public_activity。 如果有人需要更多的代码只是喊。

1 个答案:

答案 0 :(得分:1)

您可以使用多重网址 - 只需将link_to模型作为第二个参数传递给它,就是这样。但它比辅助方法慢2倍。因此,您可以保留这些丑陋的代码或使用多态URL。查看this post,其中包含建议使用的内容和位置。