building an api in rails without realizing it
DESCRIPTION
Presented at Confoo (Montreal, Canada) on 3/1/2013 In this talk I’ll show you how to build your application and get a working, well tested, and useable API in the process, with almost no extra overhead. I’ll also show you how to do it without making your controllers a mess of respond_to blocks. If anything, you’re controllers will become cleaner and leaner.TRANSCRIPT
![Page 1: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/1.jpg)
Rails APIsMonday, February 25, 13
![Page 2: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/2.jpg)
@markbates
Monday, February 25, 13
![Page 3: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/3.jpg)
Monday, February 25, 13
![Page 4: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/4.jpg)
Monday, February 25, 13
![Page 5: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/5.jpg)
http://www.metacasts.tv
CONFOO2013
Monday, February 25, 13
![Page 6: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/6.jpg)
Rails APIsMonday, February 25, 13
![Page 7: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/7.jpg)
Rails APIsMonday, February 25, 13
![Page 8: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/8.jpg)
Rails APIsWeb
Monday, February 25, 13
![Page 9: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/9.jpg)
you’re probably doing it wrong
Monday, February 25, 13
![Page 10: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/10.jpg)
Don’t Panic!
Monday, February 25, 13
![Page 11: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/11.jpg)
most APIs are an after thought
Monday, February 25, 13
![Page 12: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/12.jpg)
we can prevent that!
Monday, February 25, 13
![Page 13: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/13.jpg)
3 simple rules for building an API
Monday, February 25, 13
![Page 14: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/14.jpg)
1. consume your own API
Monday, February 25, 13
![Page 15: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/15.jpg)
2. document your API
Monday, February 25, 13
![Page 16: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/16.jpg)
3. version your API
Monday, February 25, 13
![Page 17: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/17.jpg)
building the API
Monday, February 25, 13
![Page 18: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/18.jpg)
SOAMonday, February 25, 13
![Page 19: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/19.jpg)
Service Oriented Architecture
Monday, February 25, 13
![Page 20: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/20.jpg)
SOA Pros
Monday, February 25, 13
![Page 21: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/21.jpg)
SOA Pros
• Scales Easily
Monday, February 25, 13
![Page 22: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/22.jpg)
SOA Pros
• Scales Easily
• Separate Concerns/Very Clean
Monday, February 25, 13
![Page 23: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/23.jpg)
SOA Pros
• Scales Easily
• Separate Concerns/Very Clean
• Can be easier to maintain
Monday, February 25, 13
![Page 24: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/24.jpg)
SOA Pros
• Scales Easily
• Separate Concerns/Very Clean
• Can be easier to maintain
• Solid Architecture
Monday, February 25, 13
![Page 25: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/25.jpg)
SOA Pros
• Scales Easily
• Separate Concerns/Very Clean
• Can be easier to maintain
• Solid Architecture
• Easier to refactor/rebuild
Monday, February 25, 13
![Page 26: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/26.jpg)
SOA Cons
Monday, February 25, 13
![Page 27: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/27.jpg)
SOA Cons
• Can be more difficult to maintain
Monday, February 25, 13
![Page 28: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/28.jpg)
SOA Cons
• Can be more difficult to maintain
• More complex deploys
Monday, February 25, 13
![Page 29: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/29.jpg)
SOA Cons
• Can be more difficult to maintain
• More complex deploys
• Managing several applications
Monday, February 25, 13
![Page 30: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/30.jpg)
SOA Cons
• Can be more difficult to maintain
• More complex deploys
• Managing several applications
• Potential for ‘out-of-sync’ apps
Monday, February 25, 13
![Page 31: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/31.jpg)
SOA Cons
• Can be more difficult to maintain
• More complex deploys
• Managing several applications
• Potential for ‘out-of-sync’ apps
• More difficult to test integration
Monday, February 25, 13
![Page 32: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/32.jpg)
API Client
Monday, February 25, 13
![Page 33: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/33.jpg)
API
Client
Client
Monday, February 25, 13
![Page 34: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/34.jpg)
API Client
Client
Client
Monday, February 25, 13
![Page 35: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/35.jpg)
Client
Client
Client
Service 1
Service 2
Service 3
Monday, February 25, 13
![Page 36: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/36.jpg)
a quick detour
Monday, February 25, 13
![Page 37: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/37.jpg)
Rails encourages poor API design!
Monday, February 25, 13
![Page 38: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/38.jpg)
Monday, February 25, 13
![Page 39: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/39.jpg)
class TodosController < ApplicationController # GET /todos # GET /todos.json def index @todos = Todo.all respond_to do |format| format.html # index.html.erb format.json { render json: @todos } end end # GET /todos/1 # GET /todos/1.json def show @todo = Todo.find(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @todo } end end # GET /todos/new # GET /todos/new.json def new @todo = Todo.new respond_to do |format| format.html # new.html.erb format.json { render json: @todo } end end # GET /todos/1/edit def edit @todo = Todo.find(params[:id]) end
# POST /todos # POST /todos.json def create @todo = Todo.new(params[:todo]) respond_to do |format| if @todo.save format.html { redirect_to @todo, notice: 'Todo was successfully created.' } format.json { render json: @todo, status: :created, location: @todo } else format.html { render action: "new" } format.json { render json: @todo.errors, status: :unprocessable_entity } end end end # PUT /todos/1 # PUT /todos/1.json def update @todo = Todo.find(params[:id]) respond_to do |format| if @todo.update_attributes(params[:todo]) format.html { redirect_to @todo, notice: 'Todo was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @todo.errors, status: :unprocessable_entity } end end end # DELETE /todos/1 # DELETE /todos/1.json def destroy @todo = Todo.find(params[:id]) @todo.destroy respond_to do |format| format.html { redirect_to todos_url } format.json { head :no_content } end endend
Monday, February 25, 13
![Page 40: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/40.jpg)
Don’t Scaffold!
Monday, February 25, 13
![Page 41: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/41.jpg)
Monday, February 25, 13
![Page 42: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/42.jpg)
class TodosController < ApplicationController def index @todos = Todo.all end def show @todo = Todo.find(params[:id]) end def new @todo = Todo.new end def edit @todo = Todo.find(params[:id]) end def create @todo = Todo.new(params[:todo]) if @todo.save redirect_to @todo, notice: 'Todo was successfully created.' else render action: "new" end end def update @todo = Todo.find(params[:id]) if @todo.update_attributes(params[:todo]) redirect_to @todo, notice: 'Todo was successfully updated.' else render action: "edit" end end def destroy @todo = Todo.find(params[:id]) @todo.destroy redirect_to todos_path, notice: 'Todo was successfully destroyed.' endend
Monday, February 25, 13
![Page 43: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/43.jpg)
class TodosController < ApplicationController inherit_resourcesend
Monday, February 25, 13
![Page 44: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/44.jpg)
https://github.com/josevalim/inherited_resources
Inherited Resources
Monday, February 25, 13
![Page 45: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/45.jpg)
Monday, February 25, 13
![Page 46: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/46.jpg)
class Api::V1::TodosController < ApplicationController respond_to :json before_filter do request.format = :json end def index @todos = Todo.all respond_with @todos end def show @todo = Todo.find(params[:id]) respond_with @todo end def create @todo = Todo.new(params[:todo]) if @todo.save respond_with @todo else render json: @todo.errors, status: :unprocessable_entity end end def update @todo = Todo.find(params[:id]) if @todo.update_attributes(params[:todo]) respond_with @todo else render json: @todo.errors, status: :unprocessable_entity end end def destroy @todo = Todo.find(params[:id]) @todo.destroy head :no_content endend
Monday, February 25, 13
![Page 47: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/47.jpg)
Api::V1::TodosController
version your API!
/api/v1/todos
Monday, February 25, 13
![Page 48: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/48.jpg)
i prefer URL versioning
Monday, February 25, 13
![Page 49: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/49.jpg)
others prefer header versioning
Monday, February 25, 13
![Page 50: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/50.jpg)
just pick one and stick with it!
Monday, February 25, 13
![Page 51: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/51.jpg)
SOA Review
Monday, February 25, 13
![Page 52: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/52.jpg)
SOA Review
• We’ve cleaned up our code
Monday, February 25, 13
![Page 53: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/53.jpg)
SOA Review
• We’ve cleaned up our code
• We know the API Works
Monday, February 25, 13
![Page 54: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/54.jpg)
SOA Review
• We’ve cleaned up our code
• We know the API Works
• We’re now in a good place to scale
Monday, February 25, 13
![Page 55: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/55.jpg)
consuming the API
Monday, February 25, 13
![Page 56: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/56.jpg)
don’t use Rails views
Monday, February 25, 13
![Page 57: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/57.jpg)
JavaScript
Monday, February 25, 13
![Page 58: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/58.jpg)
CORSMonday, February 25, 13
![Page 59: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/59.jpg)
Cross-origin Resource Sharing
Monday, February 25, 13
![Page 60: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/60.jpg)
https://github.com/cyu/rack-cors
rack-cors
Monday, February 25, 13
![Page 61: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/61.jpg)
module YourApp class Application < Rails::Application # ... config.middleware.use Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options] end end end
Monday, February 25, 13
![Page 62: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/62.jpg)
JavaScript Pros
Monday, February 25, 13
![Page 63: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/63.jpg)
JavaScript Pros
• Scales Easily/Pushes processing to client side
Monday, February 25, 13
![Page 64: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/64.jpg)
JavaScript Pros
• Scales Easily/Pushes processing to client side
• Separate Concerns/Very Clean
Monday, February 25, 13
![Page 65: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/65.jpg)
JavaScript Pros
• Scales Easily/Pushes processing to client side
• Separate Concerns/Very Clean
• Can be easier to maintain
Monday, February 25, 13
![Page 66: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/66.jpg)
JavaScript Pros
• Scales Easily/Pushes processing to client side
• Separate Concerns/Very Clean
• Can be easier to maintain
• “Responsive/Native” feel for clients
Monday, February 25, 13
![Page 67: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/67.jpg)
JavaScript Pros
• Scales Easily/Pushes processing to client side
• Separate Concerns/Very Clean
• Can be easier to maintain
• “Responsive/Native” feel for clients
• Easily consumes your API
Monday, February 25, 13
![Page 68: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/68.jpg)
JavaScript Cons
Monday, February 25, 13
![Page 69: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/69.jpg)
JavaScript Cons• Can be more difficult to maintain
Monday, February 25, 13
![Page 70: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/70.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
Monday, February 25, 13
![Page 71: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/71.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
• Difficult to test integration
Monday, February 25, 13
![Page 72: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/72.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
• Difficult to test integration
• JavaScript
Monday, February 25, 13
![Page 73: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/73.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
• Difficult to test integration
• JavaScript
• Paradigm shift in architecture
Monday, February 25, 13
![Page 74: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/74.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
• Difficult to test integration
• JavaScript
• Paradigm shift in architecture
• Accessibility issues
Monday, February 25, 13
![Page 75: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/75.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
• Difficult to test integration
• JavaScript
• Paradigm shift in architecture
• Accessibility issues
• SEO concerns
Monday, February 25, 13
![Page 76: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/76.jpg)
JavaScript Cons• Can be more difficult to maintain
• Multiple languages (backend/front-end)
• Difficult to test integration
• JavaScript
• Paradigm shift in architecture
• Accessibility issues
• SEO concerns
• !!Internet Explorer!!
Monday, February 25, 13
![Page 77: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/77.jpg)
pick a framework
Monday, February 25, 13
![Page 78: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/78.jpg)
don’t just use jQuery
Monday, February 25, 13
![Page 79: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/79.jpg)
the big three
Monday, February 25, 13
![Page 80: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/80.jpg)
Backbone.js
http://backbonejs.org/
Monday, February 25, 13
![Page 81: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/81.jpg)
ember
http://emberjs.com/
Monday, February 25, 13
![Page 82: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/82.jpg)
Angular.js
http://angularjs.org/
Monday, February 25, 13
![Page 83: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/83.jpg)
i can’t use JavaScript
Monday, February 25, 13
![Page 84: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/84.jpg)
2 approaches
Monday, February 25, 13
![Page 85: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/85.jpg)
“compiled” sites
Monday, February 25, 13
![Page 86: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/86.jpg)
build your own API library (and open source it!)
Monday, February 25, 13
![Page 87: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/87.jpg)
Monday, February 25, 13
![Page 88: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/88.jpg)
class TodosController < ApplicationController def index @todos = ApiLib::Todo.all end def show @todo = ApiLib::Todo.find(params[:id]) end def new @todo = ApiLib::Todo.new end def edit @todo = ApiLib::Todo.find(params[:id]) end def create @todo = ApiLib::Todo.new(params[:todo]) if @todo.save redirect_to @todo, notice: 'Todo was successfully created.' else render action: "new" end end def update @todo = ApiLib::Todo.find(params[:id]) if @todo.update_attributes(params[:todo]) redirect_to @todo, notice: 'Todo was successfully updated.' else render action: "edit" end end def destroy @todo = ApiLib::Todo.find(params[:id]) @todo.destroy redirect_to todos_path, notice: 'Todo was successfully destroyed.' endend
Monday, February 25, 13
![Page 89: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/89.jpg)
hey! there is duplicate* code
now
Monday, February 25, 13
![Page 90: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/90.jpg)
is there? or did we just move it
around?
Monday, February 25, 13
![Page 91: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/91.jpg)
Todo became ApiLib::Todo
Monday, February 25, 13
![Page 92: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/92.jpg)
we now have a reference
implementation
Monday, February 25, 13
![Page 93: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/93.jpg)
make sure to cache!!
Monday, February 25, 13
![Page 94: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/94.jpg)
The HackMonday, February 25, 13
![Page 95: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/95.jpg)
Please don’t do this!
Monday, February 25, 13
![Page 96: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/96.jpg)
I’m Serious.
Monday, February 25, 13
![Page 97: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/97.jpg)
Don’t use this hack!
Monday, February 25, 13
![Page 98: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/98.jpg)
I probably shouldn’t even show you it.
Monday, February 25, 13
![Page 99: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/99.jpg)
Ok, I’ll show you, but don’t tell
people where you heard it.
Monday, February 25, 13
![Page 100: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/100.jpg)
Monday, February 25, 13
![Page 101: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/101.jpg)
class TodosController < ApplicationController def index res = Api::V1::TodosController.action(:index).call(env) @todos = JSON.parse(res[2].body).map do |data| OpenStruct.new(data) end end end
Monday, February 25, 13
![Page 102: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/102.jpg)
projects worth noting
Monday, February 25, 13
![Page 103: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/103.jpg)
rails-apiMonday, February 25, 13
![Page 104: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/104.jpg)
Monday, February 25, 13
![Page 105: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/105.jpg)
api_docMonday, February 25, 13
![Page 106: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/106.jpg)
Monday, February 25, 13
![Page 107: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/107.jpg)
Monday, February 25, 13
![Page 108: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/108.jpg)
Final Thoughts
Monday, February 25, 13
![Page 109: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/109.jpg)
Final Thoughts
• Consume your API
Monday, February 25, 13
![Page 110: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/110.jpg)
Final Thoughts
• Consume your API
• Version your API
Monday, February 25, 13
![Page 111: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/111.jpg)
Final Thoughts
• Consume your API
• Version your API
• Document your API
Monday, February 25, 13
![Page 112: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/112.jpg)
Final Thoughts
• Consume your API
• Version your API
• Document your API
• Did I mention consume your own API?
Monday, February 25, 13
![Page 113: Building an API in Rails without Realizing It](https://reader034.vdocument.in/reader034/viewer/2022051313/5482cf47b4af9faa0d8b4878/html5/thumbnails/113.jpg)
http://www.metacasts.tv
CONFOO2013
Thank You
@markbates
Monday, February 25, 13