0

特定のアクティビティの URL を決定する次の醜いヘルパー メソッドがあります。1 つを除くすべてのケースで、パスはアンカー付きの質問へのリンクを生成します (スタック オーバーフロー スタイル)。これはif/else、追跡可能なオブジェクトがコメントであるか回答であるかにアクセスし、結果を変数に代入する一連の希薄なステートメントによって取得されます。最後に url_for ヘルパーに渡されます。

この状況に関して 2 つの質問があります。

  1. 現在の実装は、間違ったアプローチのように感じます。ユーザーがパスにアクセスするたびにこれらのパスを生成する必要がないように、アクティビティが保存され、DB へのパスを取得するときにこれらのパスを決定する必要がありますか? それとも、これに対処するためのより面倒な方法はありますか?

  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 を使用できます。2link_to番目のパラメータとしてモデルに渡すだけです。ただし、ヘルパー メソッドの方法よりも 2 倍遅くなります。したがって、この醜いコードをそのままにしておくか、ポリモーフィック URL を使用するかはあなた次第です。何をどこで使用するかを提案するこの投稿をチェックしてください。

于 2013-12-04T22:42:11.330 に答える