1

Twilio を使用して SMS メッセージを携帯電話に送信する単純な Web アプリを作成しています。メッセージの送信を試みる前に、ユーザーが完全な 10 桁の電話番号を入力したことを確認したいと考えています。

で 10 桁未満または 10 桁を超える数字でテストすると、 が表示されheroku logsますTwilio::REST::RequestError (The 'To' number 1234567890 is not a valid phone number.)

begin/rescueラッパーを使用しようとしましたが、エラーを回避するためにrender text: "Try again with a valid number."さまざまなifステートメントを試してみました。

私は Ruby と Rails と Twilio にかなり慣れていませんが、見つけたすべてのガイドを確認したことを約束します。どんな助けでも大歓迎です。以下の私の完全なコードUserController

    require 'twilio-ruby'
    class UsersController < ApplicationController

    def new
      @user = User.new
    end

    def create
      @user = User.new(params[:user])

      account_sid = '...'
      auth_token = '...'

      if @user.save
         render text: "Wasn't that fun? Hit the back button in your browser to give it another go!"
    begin
       client = Twilio::REST::Client.new account_sid, auth_token
           client.account.sms.messages.create(
           from: '+16035093259',
           to: @user.phone,
           body: @user.message
           )
        rescue Twilio::REST::RequestError
           render text: "Try again with a valid number."        
        end
     else
       render :new
     end
  end

end
4

1 に答える 1

3

SMS 送信ロジックを別のモデル/コントローラーに抽出し、バックグラウンド ジョブを使用して送信を処理します。UserController は、ユーザーの作成/変更のみを処理する必要があります。

足場:

$ rails g model sms_job user:references message:text phone submitted_at:datetime
$ rake db:migrate

モデル:

class SmsJob < AR::Base
  attr_accessible :user_id, :message, :phone

  belongs_to :user
  validates_presence_of :message, :phone, :user_id
  validates :phone,
      length: { min: 10 },
      format: { with: /\+?\d+/ }

  scope :unsubmitted, where(submitted_at: nil)

  TWILIO = {
    from_no:      '...',
    account_sid:  '...',
    auth_token:   '...'
  }

  # find a way to call this method separately from user request
  def self.process!
    unsubmitted.find_each do |job|
      begin
        client = Twilio::REST::Client.new TWILIO[:account_sid], TWILIO[:auth_token]
        client.account.sms.messages.create(
          from: TWILIO[:from_no],
          to:   job.phone,
          body: job.message
        )
        job.submitted_at = Time.zone.now
        job.save
      rescue Twilio::REST::RequestError
        # maybe set update a tries counter
        # or delete job record
        # or just ignore this error
      end
    end
  end
end

コントローラーは、SMS が送信される情報を提供する必要があります。

# don't forget the 'resources :sms_jobs' in your routes.rb
class SmsJobsController < ApplicationController
  # index, update, destroy only for only admin?

  def new
    @sms_job = SmsJobs.new
  end

  def create
    @sms_job = current_user.sms_jobs.build params[:sms_job]
    if @sms_job.save
      redirect_to root_url, notice: "Your message is being send!"
    else
      render :new
    end
  end
end

バックグラウンド処理については、これらの優れたRailscastsをご覧ください :-) 多くのメッセージを処理する必要がある場合や、Twilio の応答時間が長い (まだそのサービスを使用していない) 場合は、おそらくいくつかの同時実行性の問題を回避する必要があります。

于 2012-10-12T13:24:12.373 に答える