在Rails中有没有更惯用的方法来处理这个控制器逻辑?

时间:2013-03-11 00:24:37

标签: ruby-on-rails

  def index
    @workouts = Workout.all
    @user_workouts = current_user.workouts.order("created_at DESC") unless current_user.blank?
    if @client.present?
      @user_workouts = @client.workouts.order("created_at DESC")
    end

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @workouts }
    end
  end

这里讨论的问题是实例变量@user_workouts - 我使用嵌套路由来执行类似/ clients / 1 / workouts而不是/ workouts的操作,这将显示当前用户的锻炼情况嵌套的是/ users / 1 / workouts。

任何惯用的方法来处理这个或者只是让条件进入是正常的吗?

2 个答案:

答案 0 :(得分:3)

您可以在Workout接受User实例

上创建一个类方法
def self.for_user(user)
  where(user_id: user.id).order("created_at DESC")
end

然后简化您的操作

def index
  @workouts      = Workouts.all
  @user_workouts = Workout.for_user(@client || current_user)

  respond_to ...

如果@client存在,则会传递给for_user,否则会current_user

答案 1 :(得分:1)

你可以用以下方式干掉它:

user = @client || current_user
@user_workouts = user.workouts.order("created_at DESC")

除此之外,它看起来很不错。