我有以下丑陋的帮助方法,它确定给定活动的URL。除了1种情况之外,路径生成一个带锚的问题的链接(Stack Overflow样式),它由一系列脆弱的if/else
语句检索,访问可跟踪对象是评论还是答案然后分配结果传递给最后传递给url_for帮助器的变量。
关于这种情况我有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。 如果有人需要更多的代码只是喊。
答案 0 :(得分:1)
您可以使用多重网址 - 只需将link_to
模型作为第二个参数传递给它,就是这样。但它比辅助方法慢2倍。因此,您可以保留这些丑陋的代码或使用多态URL。查看this post,其中包含建议使用的内容和位置。