Advanced RESTful Rails

78
Advanced RESTful Rails Ben Scofield
  • date post

    11-Sep-2014
  • Category

    Technology

  • view

    33
  • download

    3

description

Ben Scofield's session on REST and Rails at Railsconf 2008

Transcript of Advanced RESTful Rails

Page 1: Advanced RESTful Rails

Advanced RESTful RailsBen Scofield

Page 2: Advanced RESTful Rails

Constraints

Page 3: Advanced RESTful Rails

Shall I compare thee to a summer's day?Thou art more lovely and more temperate.Rough winds do shake the darling buds of May,And summer's lease hath all too short a date.Sometime too hot the eye of heaven shines,And often is his gold complexion dimm'd;And every fair from fair some time declines,By chance, or nature's changing course, untrimm'd;But thy eternal summer shall not fade...

Page 4: Advanced RESTful Rails
Page 5: Advanced RESTful Rails

app controllers helpers models viewsconfig environments initializersdbdoclib taskslogpublic images javascripts stylesheetsscript performance processtest fixtures functional integration unit...

Page 6: Advanced RESTful Rails

exists app/models/ exists app/controllers/ exists app/helpers/ create app/views/users exists test/functional/ exists test/unit/dependency model exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/user.rb create test/unit/user_test.rb create test/fixtures/users.yml create db/migrate create db/migrate/20080531002035_create_users.rb create app/controllers/users_controller.rb create test/functional/users_controller_test.rb create app/helpers/users_helper.rb route map.resources :users

Page 7: Advanced RESTful Rails

REST

Page 8: Advanced RESTful Rails

Audience Participation!who is building restful applications?

Page 9: Advanced RESTful Rails

212,000 Results

Page 10: Advanced RESTful Rails

How do I handle ...

Page 11: Advanced RESTful Rails

Difficulteven for the pros

Page 12: Advanced RESTful Rails

class UsersController < ApplicationController # ...

def activate self.current_user = params[:activation_code].blank? ? false : # ... if logged_in? && !current_user.active? current_user.activate! flash[:notice] = "Signup complete!" end redirect_back_or_default('/') end

def suspend @user.suspend! redirect_to users_path end

def unsuspend @user.unsuspend! redirect_to users_path end

def destroy @user.delete! redirect_to users_path end

def purge @user.destroy redirect_to users_path endendRestful Authentication

Page 13: Advanced RESTful Rails

What is REST?

Page 14: Advanced RESTful Rails

Resources

hey-helen - flickr

Page 15: Advanced RESTful Rails

Addressability

memestate - flickr

Page 16: Advanced RESTful Rails

Representations

stevedave - flickr

Page 17: Advanced RESTful Rails

Stateless*

http://www1.ncdc.noaa.gov/pub/data/images/usa-avhrr.gif

Page 18: Advanced RESTful Rails

Audience Participation!why care?

Page 19: Advanced RESTful Rails

Process

Page 20: Advanced RESTful Rails

tiptoe - flickr

Page 21: Advanced RESTful Rails

Domain

ejpphoto - flickr

Page 22: Advanced RESTful Rails

Modeled

kerim - flickr

Page 23: Advanced RESTful Rails

?

Page 24: Advanced RESTful Rails

Identifyresources

Page 25: Advanced RESTful Rails

Selectmethods to expose

Page 26: Advanced RESTful Rails

Respectthe middleman

Page 27: Advanced RESTful Rails

Simple

Page 28: Advanced RESTful Rails

My Pull List

Page 29: Advanced RESTful Rails

Releases

Page 30: Advanced RESTful Rails

class ItemsController < ApplicationController # release listing page; filters on year/month/day from params def index; endend

ActionController::Routing::Routes.draw do |map| map.releases 'releases/:year/:month/:day', :controller => 'items', :action => 'index'end

Page 31: Advanced RESTful Rails

Issues

Page 32: Advanced RESTful Rails

class IssuesController < ApplicationController # issue detail page def show; endend

ActionController::Routing::Routes.draw do |map| map.resources :issuesend

Page 33: Advanced RESTful Rails

Series

Page 34: Advanced RESTful Rails

class TitlesController < ApplicationController # title detail page def show; endend

ActionController::Routing::Routes.draw do |map| map.resources :titlesend

Page 35: Advanced RESTful Rails

class IssuesController < ApplicationController # issue listing page; could be series page def index; endend

ActionController::Routing::Routes.draw do |map| map.resources :titles, :has_many => [:issues]end

Page 36: Advanced RESTful Rails

Users

Page 37: Advanced RESTful Rails

class UsersController < ApplicationController before_filter :require_login, :only => [:edit, :update]

# edit account def edit; end

# update account def update; endend

ActionController::Routing::Routes.draw do |map| map.resources :usersend

Page 38: Advanced RESTful Rails

Lists

Page 39: Advanced RESTful Rails

class UsersController < ApplicationController # public view - pull list def show; endend

ActionController::Routing::Routes.draw do |map| map.resources :usersend

Page 40: Advanced RESTful Rails

class TitlesController < ApplicationController # public view - pull list, given a user_id def index; endend

ActionController::Routing::Routes.draw do |map| map.resources :users, :has_many => [:titles]end

Page 41: Advanced RESTful Rails

Advanced

Page 42: Advanced RESTful Rails

Login*mc - flickr

Page 43: Advanced RESTful Rails

class SessionsController < ApplicationController # login form def new; end

# login action def create; end

# logout action def destroy; endend

ActionController::Routing::Routes.draw do |map| map.resource :sessionend

Page 44: Advanced RESTful Rails

Homepageseandreilinger - flickr

Page 45: Advanced RESTful Rails

class HomepagesController < ApplicationController # homepage def show; endend

ActionController::Routing::Routes.draw do |map| map.resource :homepage map.root :homepageend

Page 46: Advanced RESTful Rails

class ContentsController < ApplicationController # static content def show # code to find a template named according to params[:page] endend

ActionController::Routing::Routes.draw do |map| map.resources :contents map.root :controller => ‘contents’, :action => ‘show’, :page => ‘homepage’end

Page 47: Advanced RESTful Rails

class AdsController < ApplicationController # ad index - the million dollar homepage def index; endend

ActionController::Routing::Routes.draw do |map| map.resources :ads map.root :adsend

Page 48: Advanced RESTful Rails

Dashboardhel2005 - flickr

Page 49: Advanced RESTful Rails

class DashboardsController < ApplicationController before_filter :require_login

# dashboard def show; endend

ActionController::Routing::Routes.draw do |map| map.resource :dashboardend

Page 50: Advanced RESTful Rails

class InstrumentsController < ApplicationController before_filter :require_login

# dashboard def index @instruments = current_user.instruments endend

ActionController::Routing::Routes.draw do |map| map.resources :instrumentsend

Page 51: Advanced RESTful Rails

Previewashoe - flickr

Page 52: Advanced RESTful Rails

class PreviewsController < ApplicationController def create @post = Post.find(params[:post_id]) @post.attributes = params[:post]

render :template => 'posts/show' endend

ActionController::Routing::Routes.draw do |map| map.resources :posts, :has_one => [:preview]end

Page 53: Advanced RESTful Rails

class PreviewsController < ApplicationController def create @post = Post.new(params[:post])

render :template => 'posts/show' endend

ActionController::Routing::Routes.draw do |map| map.resources :posts map.resource :previewend

Page 54: Advanced RESTful Rails

Searchseandreilinger - flickr

Page 55: Advanced RESTful Rails

class PostsController < ApplicationController def index if params[:query].blank? @posts = Post.find(:all) else @posts = Post.find_for_query(params[:query]) end endend

ActionController::Routing::Routes.draw do |map| map.resources :postsend

Page 56: Advanced RESTful Rails

class SearchesController < ApplicationController def show @results = Searcher.find(params[:query]) endend

ActionController::Routing::Routes.draw do |map| map.resource :searchend

Page 57: Advanced RESTful Rails

Wizardsdunechaser - flickr

Page 58: Advanced RESTful Rails
Page 59: Advanced RESTful Rails

/galleries/new

Page 60: Advanced RESTful Rails

/restaurants/:id/photos/new

Page 61: Advanced RESTful Rails

/restaurants/:id/photos/edit

Page 62: Advanced RESTful Rails

ActionController::Routing::Routes.draw do |map| map.resources :galleries map.resources :galleries map.resources :restaurants, :has_many => [:photos]

map.with_options :controller => 'photos' do |p| p.edit_restaurant_photos 'restaurants/:restaurant_id/photos/edit', :action => 'edit' p.update_restaurant_photos 'restaurants/:restaurant_id/photos/update', :action => 'update', :conditions => {:method => :put} endend

Page 63: Advanced RESTful Rails

Collectionswooandy - flickr

Page 64: Advanced RESTful Rails

Web Servicesjosefstuefer - flickr

Page 65: Advanced RESTful Rails

Text

Inventory

Staff Directory

HR

etc.

RESTful APISearch Application

Page 66: Advanced RESTful Rails

Text

Inventory

Staff Directory

HR

etc.

RESTful API

RESTful API

RESTful API

RESTful API

Search Application

Page 67: Advanced RESTful Rails

Administration

this slide left intentionally blank

Page 68: Advanced RESTful Rails

ActionController::Routing::Routes.draw do |map| map.namespace :admin do |admin| admin.resources :invitations admin.resources :emails admin.resources :users admin.resources :features endend

Page 69: Advanced RESTful Rails

Audience Participation!what gives you fits?

Page 70: Advanced RESTful Rails

Rails, Specifically

Page 71: Advanced RESTful Rails

<a href="/records/1" onclick="if (confirm('Are you sure?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);f.submit(); };return false;">Delete</a>

<%= link_to 'Delete', record, :method => 'delete', :confirm => 'Are you sure?' %>

Accessibility

Page 72: Advanced RESTful Rails

ActionController::Routing::Routes.draw do |map| map.users 'users', :controller => ‘users’, :action => ‘index’ map.users 'users', :controller => ‘users’, :action => ‘create’ end

Hand-Written Routes

Page 73: Advanced RESTful Rails

ActionController::Routing::Routes.draw do |map| map.resources :users # Install the default route as the lowest priority. map.connect ':controller/:action/:id' end

Default Routing

Page 74: Advanced RESTful Rails

Collectionswooandy - flickr

Page 75: Advanced RESTful Rails

class RecordsController < ApplicationController def index; end

def show; end

# ...end

Mixed

ActionController::Routing::Routes.draw do |map| map.resources :recordsend

Page 76: Advanced RESTful Rails

Separated

ActionController::Routing::Routes.draw do |map| map.resource :record_list map.resources :recordsend

class RecordListsController < ApplicationController def show; end

# ...end

class RecordsController < ApplicationController def show; end

# ...end

Page 77: Advanced RESTful Rails

Audience Participation!where’s rails bitten you?