如何在救援中捕获参数转换错误

时间:2017-03-26 18:35:10

标签: ruby ruby-on-rails-4

我正在学习红宝石并从事某些工作。我有controller.rb

def city
  params.require(:id)
  begin
    @data = @user.city_details(Integer(params[:id]),
                              params[:city_name]
  rescue ArgumentError => e
    render_error(:bad_request, e.message)
  end
end

model.rb

  def city_details(id, city_name = 'philly')
    StoredProcedure::User::GetCityDetails.exec!(
        id,
        city_name
    )
  end
end

如何更新控制器以捕获与参数转换相关的错误,而不是任何与模型相关的错误?

2 个答案:

答案 0 :(得分:0)

我会在模型方法之前抛出参数,以确保您捕获正确的东西:

id = begin
  Integer(params[:id])
rescue ArgumentError => e
  render_error(:bad_request, e.message)
end
@data = @user.city_details(id)

您还可以在控制器的顶层添加救援

class MyController

  rescue_from ArgumentError do
    // code here
  end

  def mymethod
    id = Integer(params[:id])
  end
end

答案 1 :(得分:0)

只是补充了卡尔的答案,也可以是:

id = Integer(params[:id]) rescue render_error(:bad_request, 'Invalid id')