如何在控制器中处理活动记录查找params [:id]?

时间:2011-03-04 13:24:58

标签: ruby-on-rails

我想知道在轨道上的红宝石中处理这种情况的最佳方法是什么。

users_controller.rb

def show
  @user = User.find params[:id]
end

如果找不到用户,它会抛出一个异常,这个异常不会被捕获到任何地方,因此它会向最终用户显示一些丑陋的东西。

解决方案将打包到开始...救援...结束块:

def show
  begin
    @user = User.find params[:id]
  rescue
    flash[:error] = "User not found"
    redirect :action => :index
  end
end

虽然我从未见过任何我见过的铁杆文章或教程中的代码。

处理此类情况的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

请参阅文档rescue_from

答案 1 :(得分:2)

这取决于您的要求。 但是你需要一个通用的解决方案,然后你可以在ApplicaionController中设置一个救援块来处理RecordNotFound例外。

答案 2 :(得分:1)

你可以做到

def show
  @user = User.find_by_id(params[:id])
  unless @user
    flash[:error] = "User not found"
    redirect :action => :index
  end
end

但是你不能指望你会在应用程序中调用一个id不在db中的链接。请参阅question

的答案

答案 3 :(得分:1)

开发环境会向您显示丑陋的错误消息,但生产环境只会在ID无效时发出HTTP 404错误(找不到页面)。

答案 4 :(得分:0)

我认为你可以解决这个问题  @user = User.find(params[:id] = current_user)