0

我正在学习如何在我的 rails 应用程序中实现第三方 API,但正在努力处理错误响应。

更具体地说,我正在尝试使用 gem fullcontact-api-ruby实现Full Contact API。我已经用我的 API 密钥整理了身份验证,并使用 gem 方法通过控制台发出了一些请求,没有问题。

我现在正在尝试在 Profiles Controller 中使用 API 包装器方法。这个想法是:

  1. 向控制器发送电子邮件作为参数
  2. Full Contact API 方法“person()”将检索与该电子邮件关联的信息
  3. 将使用获取的 API 数据创建配置文件对象来填充其属性。
  4. 如果没有可用于该电子邮件的数据,则存在错误请求或服务器错误,然后将发生闪存错误和重定向。

我开始编写如下代码:

  # controllers/profiles_controller.rb
  def create
    @intel = FullContact.person(email: params[:email])
    if @intel[:status].to_s[0] != "2"
      flash[:error] = @intel[:status] 
      redirect_to profiles_path
    else
      # Code to create and populate a Profile instance
  end

由于成功响应的状态代码为 200,我假设我会从 Json 对象中提取代码并检查它是否以 2 开头,在这种情况下,我将继续创建实例。如果响应正常,这种方法就可以工作,因为我可以使用存储在@intel 中的 Json 对象。但是,当响应在 400 秒、500 秒时,Rails 会触发一个异常,导致 Rails 崩溃,不允许我使用任何 JSON 对象:

FullContact::NotFound in ProfilesController#create
GET https://api.fullcontact.com/v2/person.json?apiKey=MY_API_KEY&email=THE_EMAIL_IM_USING_AS_PARAMETER: 404

我显然做错了什么。我已经尝试避免引发的异常,rescue StandardError => e但我想知道在我的控制器中处理此错误的正确方法是什么。有什么帮助吗?

---更新1尝试史蒂夫解决方案--

如果我在这样的请求之后挽救异常:

  def create
    @intel = FullContact.person(email: params[:email])
    rescue FullContact::NotFound

    if @intel.nil?
      flash[:error] = "Can't process request try again later"
      redirect_to profiles_path
    else
      # Code to create and populate a Profile instance
  end

@intel 设置为 nil(即未设置为响应 JSON 对象)。我想我只是更改条件以检查 @intel 是否为 nil 但是由于某些奇怪的原因,当响应成功并且 @intel 设置为 JSON 对象时,第一个条件不会导致创建对象的方法。即使响应失败,也不确定如何将 @intel 设置为 JSON 响应。

4

2 回答 2

1

块的想法rescue是定义当你从错误中拯救时发生的动作。

构建方法的正确方法是......

def create
  @intel = FullContact.person(email: params[:email])
  # Code to create and populate a Profile instance

rescue FullContact::NotFound   
  flash[:error] = "Can't process request try again later"
  redirect_to profiles_path
end 

后出现的代码rescue在救援时执行,否则忽略。

格式是

begin
  # normal code which may or may not encounter a raised error, if no
  #  raised error, it continues to normal completion
rescue 
  # code that is only executed if there was a rescued error
ensure
  # code that always happens, regardless of rescue or not, could be 
  # used to ensure necessary cleanup happens even if an exception raised
end

方法本身就是一个完整的begin块,因此不需要上述格式大纲中的beginand 。end

您不需要一个ensure块,只需添加它以表明该功能存在。也有可能使用elsewithrescue但那是另一天:)

于 2017-07-30T10:44:00.803 回答
0

你可以做

rescue FullContact::NotFound

来挽救那个错误。

看起来错误不会让您进行比较。即便如此,你的比较还是有缺陷的。由于您要将其转换为字符串,因此需要将其与字符串进行比较

改变

   if @intel[:status].to_s[0] != 2

进入

   if @intel[:status].to_s[0] != '2'
于 2017-07-29T12:31:35.427 回答