Advanced RESTful Rails
Upcoming SlideShare
Loading in...5
×
 

Advanced RESTful Rails

on

  • 4,656 views

Slides from Ben Scofield's session on Advanced RESTful Rails at Railsconf 2008

Slides from Ben Scofield's session on Advanced RESTful Rails at Railsconf 2008

Statistics

Views

Total Views
4,656
Views on SlideShare
4,649
Embed Views
7

Actions

Likes
5
Downloads
101
Comments
0

2 Embeds 7

http://www.slideshare.net 5
http://cloudblog.dev.cloudraker.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Advanced RESTful Rails Advanced RESTful Rails Presentation Transcript

  • Advanced RESTful Rails Ben Scofield
  • Constraints
  • 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 ...
  • app controllers helpers models views config environments initializers db doc lib tasks log public images javascripts stylesheets script performance process test fixtures functional integration unit ...
  • 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
  • REST
  • Audience Participation! who is building restful applications?
  • 212,000 Results
  • How do I handle ...
  • Difficult even for the pros
  • class UsersController < ApplicationController # ... def activate self.current_user = params[:activation_code].blank? ? false : # ... if logged_in? && !current_user.active? current_user.activate! flash[:notice] = quot;Signup complete!quot; 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 Restful Authentication end end
  • What is REST?
  • Resources hey-helen - flickr
  • Addressability memestate - flickr
  • Representations stevedave - flickr
  • Stateless* http://www1.ncdc.noaa.gov/pub/data/images/usa-avhrr.gif
  • Audience Participation! why care?
  • Process
  • tiptoe - flickr
  • Domain ejpphoto - flickr
  • Modeled kerim - flickr
  • ?
  • Identify resources
  • Select methods to expose
  • Respect the middleman
  • Simple
  • My Pull List
  • Releases
  • ActionController::Routing::Routes.draw do |map| map.releases 'releases/:year/:month/:day', :controller => 'items', :action => 'index' end class ItemsController < ApplicationController # release listing page; filters on year/month/day from params def index; end end
  • Issues
  • ActionController::Routing::Routes.draw do |map| map.resources :issues end class IssuesController < ApplicationController # issue detail page def show; end end
  • Series
  • ActionController::Routing::Routes.draw do |map| map.resources :titles end class TitlesController < ApplicationController # title detail page def show; end end
  • ActionController::Routing::Routes.draw do |map| map.resources :titles, :has_many => [:issues] end class IssuesController < ApplicationController # issue listing page; could be series page def index; end end
  • Users
  • ActionController::Routing::Routes.draw do |map| map.resources :users end class UsersController < ApplicationController before_filter :require_login, :only => [:edit, :update] # edit account def edit; end # update account def update; end end
  • Lists
  • ActionController::Routing::Routes.draw do |map| map.resources :users end class UsersController < ApplicationController # public view - pull list def show; end end
  • ActionController::Routing::Routes.draw do |map| map.resources :users, :has_many => [:titles] end class TitlesController < ApplicationController # public view - pull list, given a user_id def index; end end
  • Advanced
  • Login* mc - flickr
  • ActionController::Routing::Routes.draw do |map| map.resource :session end class SessionsController < ApplicationController # login form def new; end # login action def create; end # logout action def destroy; end end
  • Homepage seandreilinger - flickr
  • ActionController::Routing::Routes.draw do |map| map.resource :homepage map.root :homepage end class HomepagesController < ApplicationController # homepage def show; end end
  • ActionController::Routing::Routes.draw do |map| map.resources :contents map.root :controller => ‘contents’, :action => ‘show’, :page => ‘homepage’ end class ContentsController < ApplicationController # static content def show # code to find a template named according to params[:page] end end
  • ActionController::Routing::Routes.draw do |map| map.resources :ads map.root :ads end class AdsController < ApplicationController # ad index - the million dollar homepage def index; end end
  • Dashboard hel2005 - flickr
  • ActionController::Routing::Routes.draw do |map| map.resource :dashboard end class DashboardsController < ApplicationController before_filter :require_login # dashboard def show; end end
  • ActionController::Routing::Routes.draw do |map| map.resources :instruments end class InstrumentsController < ApplicationController before_filter :require_login # dashboard def index @instruments = current_user.instruments end end
  • Preview ashoe - flickr
  • ActionController::Routing::Routes.draw do |map| map.resources :posts, :has_one => [:preview] end class PreviewsController < ApplicationController def create @post = Post.find(params[:post_id]) @post.attributes = params[:post] render :template => 'posts/show' end end
  • ActionController::Routing::Routes.draw do |map| map.resources :posts map.resource :preview end class PreviewsController < ApplicationController def create @post = Post.new(params[:post]) render :template => 'posts/show' end end
  • Search seandreilinger - flickr
  • ActionController::Routing::Routes.draw do |map| map.resources :posts end class PostsController < ApplicationController def index if params[:query].blank? @posts = Post.find(:all) else @posts = Post.find_for_query(params[:query]) end end end
  • ActionController::Routing::Routes.draw do |map| map.resource :search end class SearchesController < ApplicationController def show @results = Searcher.find(params[:query]) end end
  • Wizards dunechaser - flickr
  • /galleries/new
  • /restaurants/:id/photos/new
  • /restaurants/:id/photos/edit
  • 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} end end
  • Collections wooandy - flickr
  • Web Services josefstuefer - flickr
  • Staff Directory Inventory Search Application Text RESTful API HR etc.
  • RESTful API Staff Directory RESTful API Inventory Search Application Text RESTful API HR RESTful API etc.
  • this slide left intentionally blank Administration
  • ActionController::Routing::Routes.draw do |map| map.namespace :admin do |admin| admin.resources :invitations admin.resources :emails admin.resources :users admin.resources :features end end
  • Audience Participation! what gives you fits?
  • Rails, Specifically
  • <%= link_to 'Delete', record, :method => 'delete', :confirm => 'Are you sure?' %> <a href=quot;/records/1quot; onclick=quot;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;quot;>Delete</a> Accessibility
  • ActionController::Routing::Routes.draw do |map| map.users 'users', :controller => ‘users’, :action => ‘index’ map.users 'users', :controller => ‘users’, :action => ‘create’ end Hand-Written Routes
  • 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
  • Collections wooandy - flickr
  • ActionController::Routing::Routes.draw do |map| map.resources :records end class RecordsController < ApplicationController def index; end def show; end # ... end Mixed
  • ActionController::Routing::Routes.draw do |map| map.resource :record_list map.resources :records end class RecordListsController < ApplicationController def show; end # ... end class RecordsController < ApplicationController def show; end # ... end Separated
  • Audience Participation! where’s rails bitten you?
  • Thanks! ben scofield ben.scofield@viget.com http://www.viget.com/extend http://www.culann.com