I’m sad I missed RailsConf 2016 in Kansas City but it got me thinking about Rails again. Rails 5 RaceCar 1 was just released and there is a release candidate around the corner, so it’s about time to see how it plays with Twilio.
Let’s build a quick Twilio application with Rails 5. You’ll need Ruby installed, a Twilio account and a Twilio number. If you don’t already have one, you can sign up for a free Twilio account now. If you want to test this locally, you’ll need ngrok too. I’m a big fan of ngrok and I’m sure you will be too.
A brand new set of tracks
We’ll start by installing Rails 5. Open up your terminal and get yourself the latest and greatest.
$ gem install rails --version 5.0.0.rc1
Let’s create a new Rails application.
$ rails new calling-rails $ cd calling-rails
We can check out a new feature of Rails 5 already at this point by running the tests with the new, all encompassing
$ rails test
Sure, we have no tests and if you’ve been using Rails 4 it looks the same as the old
rake test command, but the difference is that in Rails 5 all commands will live under the
rails command instead of some under
rails and some under
rake. We can’t see it yet, but the test runner has actually picked up some very nice upgrades along the way as well.
We can run our Rails server at this point too. Just enter:
$ rails server
on the command line and open up http://localhost:3000.
Yay! Check out the new branding and illustration for the successful install page.
Certain things haven’t changed with this latest version of Rails. To add the
twilio-ruby gem, stop the server then open up the
Gemfile, add the line:
and install the gem using Bundler.
$ bundle install
To get our Twilio app off the ground, we’re going to need a controller.
$ rails generate controller twilio
app/controllers/twilio_controller.rb and let’s build a voice endpoint for our Twilio number. The idea is that when a call is made to our Twilio number, Twilio will send an HTTP request to our application to ask what to do with it. This action will respond to that request with the instructions in TwiML, which is a set of XML tags and attributes that Twilio understands.
First, we need to disable verifying the Rails authenticity token. This is intended to stop CSRF attacks, but that doesn’t apply when we’re expecting to receive a webhook from an external service. We also have our own way of verifying a request came from Twilio using Rack middleware.
class TwilioController < ApplicationController skip_before_action :verify_authenticity_token end
Now we can write an action to respond to an incoming phone call. We’re going to build up some TwiML to speak a response to us down the phone, send us a congratulatory SMS message and play us out with a favourite tune.
class TwilioController < ApplicationController skip_before_action :verify_authenticity_token def voice response = Twilio::TwiML::Response.new do |r| r.Say "Yay! You're on Rails!", voice: "alice" r.Sms "Well done building your first Twilio on Rails 5 app!" r.Play "http://linode.rabasa.com/cantina.mp3" end render :xml => response.to_xml end end
We’re using the Twilio Ruby library’s TwiML builder (which is actually based on the builder gem) to generate our XML which we then render with the correct content type using the Rails
In order to serve our request from Twilio, we’ll need a route too. Open up
config/routes.rb and enter:
Rails.application.routes.draw do post 'twilio/voice' => 'twilio#voice' end
Now a POST request to our application at the path
/twilio/voice will route through to the action we just wrote. Start the server and we’ll get Twilio POSTing those requests.
$ rails server
Tunnelling with ngrok
We need to make our local application available to the internet so that Twilio can get through to it. I like using ngrok to do this, so I just open a new terminal window and type:
$ ngrok http 3000
When ngrok starts, it looks like this. Grab the URL you can see, we’re going to need that right away.
We need the URL, along with the route we created earlier, so that we can tell Twilio what URL to call when we phone our number. Jump into your Twilio console, find or buy a number that you want to use for this (make sure it can receive phone calls) and edit the number.
Find the Voice section, make sure you have Webhooks/TwiML selected as your configure option. Then, for when a call comes in, enter the full URL to your voice action.
Save the settings, whip out your phone and dial up your number. Soon enough you’ll be hearing the celebratory tones of a successful Twilio call.
Rocking on Rails 5
Now we’ve built our first Rails 5 and Twilio app there’s much more to be done. You could read up on all the other changes between Rails 4 and 5, particularly the brand new, real time ActionCable. It seems like a useful candidate for making a snappy user interface for two factor authentication with Authy OneTouch.
If you want to talk more about Ruby, Rails and communications then SIGNAL is the place to be. Not only are there over a hundred sessions on topics from real time communications to security and even bots, but we have two members of the Rails Committers team speaking. Eileen Uchitelle will be covering common software vulnerabilities and Sean Griffin will be diving into the hidden semantics of the code we write. I’ll be there too, and while I haven’t managed to get a commit into Rails yet, I do have a promo code that will get you 20% off to join Eileen and Sean in just two short weeks. Register now and use the code PNASH20 at checkout.