如何在 Rails 中处理 Twilio API SMS 错误和无效电话号码

J C*_*ton 1 ruby ruby-on-rails twilio

如何处理 Twilio API 中有关创建 SMS 消息的错误?

每次输入无效的电话号码时,我都会收到一条消息和 500 错误:

无法创建记录:“收件人”号码不是有效的电话号码。

我怎样才能让它重定向回主页并简单地闪现错误通知?

class Messager

def initialize
  @account_sid = ENV['ACCOUNT_SID']
  @auth_token = ENV['AUTH_TOKEN']
  @twilio_number = ENV['TWILIO_NUMBER']


  @client = Twilio::REST::Client.new @account_sid, @auth_token

end
def send_message(phone_number, movies, username)

  text_message = @client.api.account.messages.create(
    from: @twilio_number,
    to: phone_number,
    body: "Hello movie lover, #{username}!\nHere is your current watch list:\n#{movies}"
    )
  puts text_message.to
end
end
Run Code Online (Sandbox Code Playgroud)

我不需要任何花哨的东西,只需重定向到主页和一条快速错误消息,说明他们的电话号码无效,而不是 500 错误页面。我是 Twilio API 的新手,我已经解决了这个问题好几个小时了。

phi*_*ash 5

Twilio 开发人员布道者在这里。

当您使用 Ruby gem 向 Twilio API 发出请求并且出现问题时,库将抛出类型为 的错误Twilio::REST::RestError

为了避免您的用户出现 500 错误,您应该从这个错误中拯救出来,并对您的控制器做一些其他的事情。我不确定你的控制器是什么样子,所以我会猜测你应该做什么。

首先,Messager如果您收到错误消息,我会更新该类以存储错误消息。此外,该send_message函数应返回一个布尔值来描述消息是否已成功发送。

class Messager
  attr_reader :error

  def initialize
    @account_sid = ENV['ACCOUNT_SID']
    @auth_token = ENV['AUTH_TOKEN']
    @twilio_number = ENV['TWILIO_NUMBER']
    @client = Twilio::REST::Client.new @account_sid, @auth_token
  end

  def send_message(phone_number, movies, username)
    begin
      text_message = @client.api.account.messages.create(
        from: @twilio_number,
        to: phone_number,
        body: "Hello movie lover, #{username}!\nHere is your current watch list:\n#{movies}"
      )
      return true
    rescue Twilio::REST::RestError => error
      @error = error
      return false
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,在您的控制器中send_message,如果消息成功或失败,您可以调用并执行不同的操作。

class MessagingController < ApplicationController
  def create
    messager = Messager.new
    if messager.send_message(params[:phone_number], current_user.movies, current_user.username)
      # Success! Message sent!
      # Now do what you were going to do with the successfull result
    else
      # Boo, something happened.
      Rails.logger.warn("#{messager.error.code}: #{messager.error.message}")
      # Redirect or render an action with an error here.
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

让我知道这是否有帮助。