1

コントローラーに2つのアクションがあります

def up_vote
    lesson = Lesson.find(params[:id])
    current_user.up_vote!(lesson)
    flash[:message] = 'Thanks for voting!'
    redirect_to lesson_path(lesson)
end

def down_vote
    lesson = Lesson.find(params[:id])
    current_user.down_vote!(lesson)
    flash[:message] = 'Thanks for voting!'
    redirect_to lesson_path(lesson)
end

これをリファクタリングする良い方法は何だろうと思っていました(DRYを念頭に置いて)?before_filter を悪用しようとしてはいけないとオンラインで読みました。他に何が使えますか?ありがとう!

4

2 に答える 2

6
def vote_up
  vote(:up)
end

def vote_down
  vote(:down)
end

protected

def vote(direction)
  lesson = Lesson.find(params[:id])
  current_user.send :"#{direction}_vote!",lesson
  flash[:message] = 'Thanks for voting!'
  redirect_to lesson_path(lesson)
end
于 2012-04-17T03:52:56.493 に答える
1

最も明白なのは、up_or_downパラメーターを取る単一のメソッドを使用することです。

def vote(up_or_down)
    lesson = Lesson.find(params[:id])
    if up_or_down.eql? "up"
      current_user.up_vote!(lesson)
    elsif up_or_down.eql? "down"
      current_user.down_vote!(lesson)
    else
      # send an error message or just return
    end
    flash[:message] = 'Thanks for voting!'
    redirect_to lesson_path(lesson)
end
于 2012-04-17T02:31:10.987 に答える