Как реорганизовать этот полиморфный URL-адрес помощника

У меня есть следующий уродливый вспомогательный метод, который определяет URL для данного вида деятельности. Во всех случаях, кроме одного, путь генерирует ссылку на вопрос с привязкой (стиль), который извлекается серией слабых операторов 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

Я использую рельсы 3.2.14, ruby 1.9.3p448 и gsm public_activity - https://github.com/pokonski/public_activity. Если кому-то нужно больше кода, просто кричите.

1 ответ

Вы можете использовать polyoprhic url - просто перейдите к link_to модели в качестве второго параметра и что это. Но он 2x медленнее, чем метод вспомогательного метода. Таким образом, вы можете оставить этот уродливый код или использовать полиморфный URL. Проверьте этот пост, который предлагает, что использовать и где.

licensed under cc by-sa 3.0 with attribution.