4

enabled_onlyコントローラーには、ユーザーを見つけるための 2 つのメソッドがあります (スコープに注意してください)。

before_filter :find_user, :only => :show
before_filter :find_any_user, :only => [:edit, :update, :destroy]

def find_user
  @user = User.enabled_only.find(params[:id])
rescue ActiveRecord::RecordNotFound
  flash[:alert] = "The user you were looking for could not be found"
  redirect_to root_path
end

def find_any_user
  @user = User.find(params[:id])
rescue ActiveRecord::RecordNotFound
  flash[:alert] = "The user you were looking for could not be found"
  redirect_to root_path
end

確かに、これらを 1 つのメソッドにマージして:action == 'show'、エラーをキャッチするためのレスキューを取得できなかったかどうかを確認できます。次のようなことを試しましたが、うまくいきませんでした。

before_filter :find_user, :only => [:show, :edit, :update, :destroy]

def find_user
  @user = if :action == 'show'
    User.enabled_only.find(params[:id])
  else
    User.find(params[:id])
  end
rescue ActiveRecord::RecordNotFound
  flash[:alert] = "The user you were looking for could not be found"
  redirect_to root_path
end

これを行う方法についてアドバイスをお願いします。

ありがとう

4

1 に答える 1

4

beginaと aの間で「保護」したいコードをラップする必要がありますrescue

before_filter :find_user, :only => [:show, :edit, :update, :destroy]

def find_user
  begin
    @user = if :action == 'show'
      User.enabled_only.find(params[:id])
    else
      User.find(params[:id])
    end
  rescue ActiveRecord::RecordNotFound
    flash[:alert] = "The user you were looking for could not be found"
    redirect_to root_path
  end
end

ところで、あなたのテスト:action == 'show'は決して真実ではありません。:actionは値が であるシンボルであり:action、その値は決して変化しません。同様に'show'、その値は変化しません。これを達成するための最良の方法はわかりませんが、できますが、できますif params[:action] == "show"

于 2012-10-29T22:45:26.567 に答える