0

我有以下丑陋的辅助方法,它确定给定活动的 URL。在除 1 种情况之外的所有情况下,路径都会生成指向带有锚点(堆栈溢出样式)的问题的链接,该链接由一系列脆弱的if/else语句检索,访问可跟踪对象是评论还是答案,然后将结果分配给变量最后将其传递给 url_for 助手。

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

  1. 当前的实现感觉像是错误的方法。我是否应该在保存活动时确定这些路径并捕获到数据库的路径,这样我就不必在每次用户访问路径时生成这些路径?或者有没有更狡猾的方式来处理这个问题?

  2. 如果这是向下或类似的正确途径,首先,我如何将其重构为更简洁的东西,这应该是一个类方法还是一个辅助方法作为它唯一处理活动路径的方法?

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。如果有人需要更多代码,请大声喊叫。

4

1 回答 1

1

您可以使用多态 url - 只需将link_to模型作为第二个参数传递就可以了。但它比辅助方法慢 2 倍。所以这取决于你留下这个丑陋的代码或使用多态 url。查看这篇文章,它建议使用什么以及在哪里。

于 2013-12-04T22:42:11.330 回答