Enter the App Era with Ruby on Rails
@matteocollina
Matteo Collina
Software Engineer
@matteocollina
matteocollina.com
www.mavigex.comwww.wemobi.it
How is built an App?
http://www.flickr.com/photos/dschulian/3173331821/
Icons by Fasticon
Code Run ServerI need to serve my data to
Web and Mobile Apps
We need an API
We need an API
Who has APIs?
Who has APIs?
Who has APIs?
Who has APIs?
And many many others..
We will develop an API
http://www.flickr.com/photos/oneaustin/1261907803
We need to be fast!
http://www.flickr.com/photos/oneaustin/1261907803
We have just twenty minutes
What do we want to build? http://www.flickr.com/photos/oberazzi/318947873/
Another tool for nerds?
http://www.flickr.com/photos/eyesontheroad/2260731457/
Another Todo List?
http://www.flickr.com/photos/eyesontheroad/2260731457/
Enter MCDo.http://github.com/mcollina/mcdo
Enter MCDo.
The First Todo Listdelivered as a REST API
The First Todo Listdelivered as a REST API
Signup APIhttp://github.com/mcollina/mcdo
Signup APIFeature: Signup API As a MCDO developer In order to develop apps I want to register new users
Scenario: Succesful signup When I call "/users.json" in POST with: """ { "user": { "email": "[email protected]", "password": "abcde", "password_confirmation": "abcde" } } """ Then the JSON should be: """ { "id": 1, "email": "[email protected]" } """
Signup API
Scenario: signup fails with a wrong password_confirmation When I call "/users.json" in POST with: """ { "user": { "email": "[email protected]", "password": "abcde", "password_confirmation": "abcde1" } } """ Then the JSON should be: """ { "errors": { "password": ["doesn't match confirmation"] } } """
How?
How?
Ruby on Rails
Cucumber
RSpec
JSON-spec
How?
Ruby on Rails
Cucumber
RSpec
JSON-spec
Let’s see some code!
Login APIhttp://github.com/mcollina/mcdo
Login APIFeature: Login API As a MCDO developer In order to develop apps I want to login with an existing user
Background: Given there is the following user: | email | password | password_confirmation | | [email protected] | aa | aa |
Scenario: Succesful login When I call "/session.json" in POST with: """ { "email": "[email protected]", "password": "aa" } """ Then the JSON should be: """ { "status": "authenticated" } """
Login API Scenario: Failed login When I call "/session.json" in POST with: """ { "email": "[email protected]", "password": "bb" } """ Then the JSON should be: """ { "status": "not authenticated" } """
Login APIScenario: Validating an active session Given I call "/session.json" in POST with: """ { "email": "[email protected]", "password": "aa" } """ When I call "/session.json" in GET Then the JSON should be: """ { "status": "authenticated" } """
Login APIScenario: Validating an active session Given I call "/session.json" in POST with: """ { "email": "[email protected]", "password": "aa" } """ When I call "/session.json" in GET Then the JSON should be: """ { "status": "authenticated" } """
Let’s see some code!
Lists APIhttp://github.com/mcollina/mcdo
Lists APIFeature: Lists API As a MCDO developer In order to develop apps I want to manage a user's lists
Background: Given I login succesfully with user "[email protected]"
Scenario: Default lists When I call "/lists.json" in GET Then the JSON should be: """ { "lists": [{ "id": 1, "name": "Personal", "link": "http://www.example.com/lists/1", "items_link": "http://www.example.com/lists/1/items" }] } """
Lists API
Scenario: Creating a list When I call "/lists.json" in POST with: """ { "list": { "name": "foobar" } } """ Then the JSON should be: """ { "name": "foobar", "items_link": "http://www.example.com/lists/1/items" } """
Lists API Scenario: Creating a list should add it to the index Given I call "/lists.json" in POST with: """ { "list": { "name": "foobar" } } """ When I call "/lists.json" in GET Then the JSON should be: """ { "lists": [{ "id": 2, "name": "foobar", "link": "http://www.example.com/lists/2", "items_link": "http://www.example.com/lists/2/items" }, { "id": 1, "name": "Personal", "link": "http://www.example.com/lists/1", "items_link": "http://www.example.com/lists/1/items" }] } """
Lists API Scenario: Removing a list (and the index is empty) Given I call "/lists/1.json" in DELETE When I call "/lists.json" Then the JSON should be: """ { "lists": [] } """
Scenario: Updating a list's name When I call "/lists/1.json" in PUT with: """ { "list": { "name": "foobar" } } """ Then the JSON should be: """ { "name": "foobar", "items_link": "http://www.example.com/lists/1/items" } """
Scenario: Removing a list (and the index is empty) Given I call "/lists/1.json" in DELETE When I call "/lists.json" Then the JSON should be: """ { "lists": [] } """
Scenario: Updating a list's name When I call "/lists/1.json" in PUT with: """ { "list": { "name": "foobar" } } """ Then the JSON should be: """ { "name": "foobar", "items_link": "http://www.example.com/lists/1/items" } """
Lists API
Let’s see some code!
Items APIhttp://github.com/mcollina/mcdo
Items API
Feature: Manage a list's items As a developer In order to manipulate the list's item I want to access them through APIs
Background: Given I login succesfully with user "[email protected]"
Scenario: Default items When I call "/lists/1/items.json" in GET Then the JSON should be: """ { "items": [{ "name": "Insert your items!", "position": 0 }], "list_link": "http://www.example.com/lists/1" } """
Items API Scenario: Moving an element to the top Given I call "/lists/1/items.json" in POST with: ... And I call "/lists/1/items.json" in POST with: ... When I call "/lists/1/items/2/move.json" in PUT with: """ { "position": 0 } """ Then the JSON should be: """ { "items": [{ "name": "b", "position": 0 }, { "name": "Insert your items!", "position": 1 }, { "name": "c", "position": 2 }], "list_link": "http://www.example.com/lists/1" } """
Items API Scenario: Moving an element to the top Given I call "/lists/1/items.json" in POST with: ... And I call "/lists/1/items.json" in POST with: ... When I call "/lists/1/items/2/move.json" in PUT with: """ { "position": 0 } """ Then the JSON should be: """ { "items": [{ "name": "b", "position": 0 }, { "name": "Insert your items!", "position": 1 }, { "name": "c", "position": 2 }], "list_link": "http://www.example.com/lists/1" } """
Let’s see some code!
Do we need an admin panel?
Do we need an admin panel?
Do we need an admin panel?
Put in your Gemfile:
gem 'activeadmin'gem 'meta_search', '>= 1.1.0.pre'
Then run:
$ bundle install$ rails g active_admin:install$ rails g active_admin:resource users$ rails g active_admin:resource lists$ rails g active_admin:resource items$ rake db:migrate
Do we need an admin panel?
Put in your Gemfile:
gem 'activeadmin'gem 'meta_search', '>= 1.1.0.pre'
Then run:
$ bundle install$ rails g active_admin:install$ rails g active_admin:resource users$ rails g active_admin:resource lists$ rails g active_admin:resource items$ rake db:migrate
Let’s see some code!
Build a JS App!
Build a JS App!
Backbone.js: MVC in the browser
Rails asset pipeline concatenate and minifies our JS automatically
We can even write our app in CoffeeScript: it works out of the box.
Build a JS App!
Backbone.js: MVC in the browser
Rails asset pipeline concatenate and minifies our JS automatically
We can even write our app in CoffeeScript: it works out of the box.
to the code.. again?
http://www.flickr.com/photos/oneaustin/1261907803
http://www.flickr.com/photos/oneaustin/1261907803
We are late,the #codemotion
crew are kicking me out
TL;DR
http://www.flickr.com/photos/evilaugust/3307382858
TL;DR
Mobile Apps need an API
Ruby on Rails is good for writing APIs
You can build nice admin interfaces with ActiveAdmin
You can craft Javascript Apps easily using the asset pipeline.
Any Questions?
Thank You!