特定のアクティビティの URL を決定する次の醜いヘルパー メソッドがあります。1 つを除くすべてのケースで、パスはアンカー付きの質問へのリンクを生成します (スタック オーバーフロー スタイル)。これはif/else
、追跡可能なオブジェクトがコメントであるか回答であるかにアクセスし、結果を変数に代入する一連の希薄なステートメントによって取得されます。最後に url_for ヘルパーに渡されます。
この状況に関して 2 つの質問があります。
現在の実装は、間違ったアプローチのように感じます。ユーザーがパスにアクセスするたびにこれらのパスを生成する必要がないように、アクティビティが保存され、DB へのパスを取得するときにこれらのパスを決定する必要がありますか? それとも、これに対処するためのより面倒な方法はありますか?
これが適切な方法である場合、または同様の方法である場合、まず、これをより簡潔なものにリファクタリングするにはどうすればよいですか?また、アクティビティのパスを処理する唯一の方法として、これをクラス メソッドまたはヘルパー メソッドにする必要がありますか?
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を使用しています。さらにコードが必要な場合は、ただ叫んでください。