メニュー

Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

RubyおよびRailsを使用したワークフローの自動化

ビジネスを構築していく中でより抽象的なコンセプトのひとつは、そのワークフローがどのようなものかということです。

At its core, setting up a standardized workflow is about enabling your service providers (agents, hosts, customer service reps, administrators, and the rest of the gang) to better serve your customers.

To illustrate a very real-world example, today we'll build a Ruby on Rails webapp for finding and booking vacation properties — tentatively called Airtng.

仕組みは次のとおりです:

  1. ホストが貸別荘の一覧を作成します
  2. A guest requests a reservation for a property
  3. ホストには予約リクエストを知らせるSMSが受信されます。 ホストは予約を「承諾」または「否認」します
  4. The guest is notified whether a request was rejected or accepted

AirbnbがTwilio SMSを使用して、世界中の6千万以上の旅行者たちに対するレンタル体験を明解にしている方法を学びましょう。

ワークフローの構成要素

We'll be using the Twilio REST API to send our users messages at important junctures. Here's a bit more on our API:

        
        
        
        
        config/routes.rb

        Application routes

        config/routes.rb

        Ready to go? Boldly click the button right after this sentence.

        次のステップに果敢に進む

        The Vacation Property Model

        The VacationProperty model belongs to the User who created it (we'll call this user the host moving forward) and contains only two properties, a description and an image_url.

        It has two associations in that it has many reservations and therefore many users through those reservations.

        The best way to generate the model and all of the basic CRUD scaffolding we'll need is to use the Rails command line tool:

        bin/rails generate scaffold VacationProperty 
        description:string image_url:string
        

        One of the benefits of using the Rails generator is that it creates all of our routes, controllers and views so that we have a fully functional CRUD interface out of the box. Nifty!

              
              
              
              
              app/models/vacation_property.rb

              休暇物件モデル

              app/models/vacation_property.rb

              Let's jump into the stew and look next at the Reservation mode.

              Handle the Workflow

              予約モデル

              Reservation モデルは、このアプリケーションに対するワークフローの中心です。以下の追跡を担当します。

              • 関連付けられている VacationProperty
              • the User who owns that vacation property (the host)
              • ゲストの名前と電話番号
                    
                    
                    
                    
                    app/models/reservation.rb

                    予約モデル

                    app/models/reservation.rb

                    Since the reservation can only have one guest for our example we simplified the model by assigning a name and phone_number directly.

                    We'll cover how we did this later. Next, however, we'll zoom in on the reservation status.

                    Show Me Reservation Statuses

                    ReservationStatus

                    First we validate some key properties and define the associations so that we can later lookup those relationships through the model. (If you'd like more context, the Rails guide explains models and associations quite well.)

                    The main property we need to enable a reservation workflow is some sort of status that we can monitor. This is a perfect candidate for an enumerated status attribute.

                    列挙属性

                    列挙属性では、それぞれのステータスに検索可能な名前を付け、シンプルな整数をテーブルに格納しておくことができます。以下は一例です。

                    # reservation.pending! status: 0
                    reservation.status = "confirmed"
                    reservation.confirmed? # => true
                    
                          
                          
                          
                          
                          app/models/reservation.rb

                          Once we have an attribute that can trigger our workflow events, it's time to write some callbacks. Let's look there next.

                          You Better Call Me Back

                          The Reservations Controller

                          貸別荘プロパティーページから create 経路に予約の詳細をポストします。

                          After we create the reservation we want to notify the host that she has a request pending. After she accepts or rejects it we want to notify the guest of the news.

                          While the Reservation model handles the notification, we want to keep all these actions in the controller to show our intentions.

                                
                                
                                
                                
                                Create a new reservation

                                予約コントローラー

                                Create a new reservation

                                Next up, let's take a look at how exactly we'll notify the lucky host.

                                ホストに通知する

                                In theory, notifying the host should be as simple as looking up the host User and send her an SMS. However:

                                How do we ensure our hosts are: a) responding to the correct reservation inquiry and b) not getting spammed?

                                保留中の予約

                                Our simple solution to both problems:

                                • We only notify the host of the oldest pending reservation.
                                • We don't send another SMS until the host has dealt with the last reservation.

                                The easiest way to surface pending_reservations for a user is to create a helper method on the User model. We'll go over that in the next step.

                                SMS の送信

                                If in fact the host only has one pending reservation, we're going to fire an SMS off to the host immediately.

                                      
                                      
                                      
                                      
                                      app/models/reservation.rb

                                      Let's now take a look at the User model.

                                      ユーザーモデル

                                      We have one model for both the guests and the hosts who are using Airtng.

                                      When Airtng takes off it will merit creating two more classes that inherit from the base User class. Since we're still on the ground this should suit us fine (to boldly stay...).

                                      First, we validate the 'uniqueness' of our user - they should be unique, just like everyone else. Specifically, it is important we ensure that the phone_number attribute is unique since we will use this to look up User records on incoming SMSes.

                                      After that, we set up our associations for when we need to query for reservations.

                                            
                                            
                                            
                                            
                                            app/models/user.rb

                                            Arguably the most important task delegated to our User model is to send an SMS to the user when our app requests it. Click 'Next' below to move to that pane.

                                            Send Messages Into the Void

                                            Since we only send text messages in our application when we're communicating with specific users, it makes sense to create this function on the User class. And yes: these 7 lines are all you need to send SMSes with Ruby and Twilio! It's really just two steps:

                                            1. We look up our app's phone number.
                                            2. We initiate our Twilio client and build the message.

                                            Now whenever we need to communicate with a user, whether host or guest, we can pass a message to this user method and... Voilà! We've sent them a text.

                                            (If you peek below this method you'll see the helper methods for finding pending_reservations that we mentioned previously.)

                                                  
                                                  
                                                  
                                                  
                                                  app/models/user.rb

                                                  Now we need a way to handle incoming texts so our lucky host can accept or reject a request. Let's look there next.

                                                  Handle Incoming Messages

                                                  The accept_or_reject controller handles our incoming Twilio request and does three things:

                                                  1. Check for a pending reservation the user owns
                                                  2. Update the status of the reservation
                                                  3. Respond to the host (and guest)

                                                  着信 Twilio リクエスト

                                                  An incoming request from Twilio comes with some helpful parameters including the From phone number and the message Body.

                                                  We'll use the From parameter to lookup the host and check if she has any pending reservations. If she does, we'll use the message body to check if she accepted or rejected the reservation.

                                                  次に、TwiML レスポンスにリクエストをリダイレクトし、ユーザーにメッセージを戻します。

                                                  TwiML レスポンス

                                                  Usually a Rails controller has a template associated with it that renders a webpage. In our case, the only request being made will be by Twilio's API so we don't need a public page. Instead we're using Twilio's Ruby API to render a custom TwiML response as raw XML on the page.

                                                        
                                                        
                                                        
                                                        
                                                        app/controllers/reservations_controller.rb

                                                        ホストの決定の処理用のWebhook

                                                        app/controllers/reservations_controller.rb

                                                        Next up, let's see how to notify the guest.

                                                        Notify the Guest

                                                        The final step in our workflow is to notify the guest that their reservation has been booked (or, ahem, rejected).

                                                        We called this method earlier from the reservations_controller when we updated the reservation status. Here's what it does:

                                                        • ★を使ってゲストをルックアップします。 reservation.phone_number
                                                        • If the status was changed to an expected result we notify the guest of the change.

                                                        もちろん、SMS メッセージをゲストに送信するために必要なのは、すべてのユーザーに存在する send_message_via_sms メソッドを呼び出すだけです。

                                                              
                                                              
                                                              
                                                              
                                                              app/models/reservation.rb

                                                              Let the guest have the host's decision

                                                              app/models/reservation.rb

                                                              Thank you so much for your help! Airtng now has a nice SMS based workflow in place and you're ready to add a workflow to your own application.

                                                              On the next pane, we'll look at some other features you might enjoy adding for your use cases.

                                                              他に構築できるもの

                                                              次はどこでしょうか?

                                                              Ruby and Rails and Twilio: what an excellent combo. Here are a couple other ideas you might pursue:

                                                              匿名通話

                                                              音声通話およびSMSを使い匿名でユーザー同士を接続しプライバシーを保護します。

                                                              自動アンケート

                                                              Collect instant feedback from your customers with SMS or Voice.

                                                              これは役に立ちましたか?

                                                              Thanks for checking this tutorial out! Tweet to us @twilio with what you're building!

                                                              Jarod Reyes Zachary Pitts Jose Oliveros Agustin Camino David Prothero Samuel Mendes Andrew Baker Paul Kamp Kat King
                                                              Rate this page:

                                                              ヘルプが必要ですか?

                                                              We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.