Advanced RESTful Rails

  • 3,143 views
Uploaded on

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,143
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
101
Comments
0
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Advanced RESTful Rails Ben Scofield
  • 2. Constraints
  • 3. 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 ...
  • 4. 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 ...
  • 5. 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
  • 6. REST
  • 7. Audience Participation! who is building restful applications?
  • 8. 212,000 Results
  • 9. How do I handle ...
  • 10. Difficult even for the pros
  • 11. 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
  • 12. What is REST?
  • 13. Resources hey-helen - flickr
  • 14. Addressability memestate - flickr
  • 15. Representations stevedave - flickr
  • 16. Stateless* http://www1.ncdc.noaa.gov/pub/data/images/usa-avhrr.gif
  • 17. Audience Participation! why care?
  • 18. Process
  • 19. tiptoe - flickr
  • 20. Domain ejpphoto - flickr
  • 21. Modeled kerim - flickr
  • 22. ?
  • 23. Identify resources
  • 24. Select methods to expose
  • 25. Respect the middleman
  • 26. Simple
  • 27. My Pull List
  • 28. Releases
  • 29. 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
  • 30. Issues
  • 31. ActionController::Routing::Routes.draw do |map| map.resources :issues end class IssuesController < ApplicationController # issue detail page def show; end end
  • 32. Series
  • 33. ActionController::Routing::Routes.draw do |map| map.resources :titles end class TitlesController < ApplicationController # title detail page def show; end end
  • 34. 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
  • 35. Users
  • 36. 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
  • 37. Lists
  • 38. ActionController::Routing::Routes.draw do |map| map.resources :users end class UsersController < ApplicationController # public view - pull list def show; end end
  • 39. 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
  • 40. Advanced
  • 41. Login* mc - flickr
  • 42. 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
  • 43. Homepage seandreilinger - flickr
  • 44. ActionController::Routing::Routes.draw do |map| map.resource :homepage map.root :homepage end class HomepagesController < ApplicationController # homepage def show; end end
  • 45. 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
  • 46. 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
  • 47. Dashboard hel2005 - flickr
  • 48. ActionController::Routing::Routes.draw do |map| map.resource :dashboard end class DashboardsController < ApplicationController before_filter :require_login # dashboard def show; end end
  • 49. 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
  • 50. Preview ashoe - flickr
  • 51. 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
  • 52. 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
  • 53. Search seandreilinger - flickr
  • 54. 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
  • 55. ActionController::Routing::Routes.draw do |map| map.resource :search end class SearchesController < ApplicationController def show @results = Searcher.find(params[:query]) end end
  • 56. Wizards dunechaser - flickr
  • 57. /galleries/new
  • 58. /restaurants/:id/photos/new
  • 59. /restaurants/:id/photos/edit
  • 60. 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
  • 61. Collections wooandy - flickr
  • 62. Web Services josefstuefer - flickr
  • 63. Staff Directory Inventory Search Application Text RESTful API HR etc.
  • 64. RESTful API Staff Directory RESTful API Inventory Search Application Text RESTful API HR RESTful API etc.
  • 65. this slide left intentionally blank Administration
  • 66. 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
  • 67. Audience Participation! what gives you fits?
  • 68. Rails, Specifically
  • 69. <%= 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
  • 70. ActionController::Routing::Routes.draw do |map| map.users 'users', :controller => ‘users’, :action => ‘index’ map.users 'users', :controller => ‘users’, :action => ‘create’ end Hand-Written Routes
  • 71. 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
  • 72. Collections wooandy - flickr
  • 73. ActionController::Routing::Routes.draw do |map| map.resources :records end class RecordsController < ApplicationController def index; end def show; end # ... end Mixed
  • 74. 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
  • 75. Audience Participation! where’s rails bitten you?
  • 76. Thanks! ben scofield ben.scofield@viget.com http://www.viget.com/extend http://www.culann.com