Advanced RESTful Rails

44 %
56 %
Information about Advanced RESTful Rails

Published on May 31, 2008

Author: viget

Source: slideshare.net

Description

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

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

Add a comment

Related presentations

Related pages

Building a RESTful API in a Rails Application - AirPair

Rails expert Abraham Polishchuk walks through the requirements for building a RESTful API in Rails and points out some common pitfalls.
Read more

RESTful Rails Development - b-simple.de

RESTful Rails Development Ralf Wirdemann Thomas Baustert ralf.wirdemann@b-simple.de thomas.baustert@b-simple.de translated by Florian Gorsdorf¨ and Ed Ruder
Read more

Advanced RESTful Rails | SpeakerRate

One of the big benefits of Rails is that it standardizes application development in a way you don’t see with many of the alternatives. That has made ...
Read more

Rails Routing from the Outside In — Ruby on Rails Guides

Rails Routing from the Outside In. ... Advanced techniques such as constraints and ... here's a small section of the rails routes output for a RESTful route:
Read more

Rails 4: Advanced Rest API Approach and Examples - Stack ...

I'm creating a restful API for my app in Rails 4. I took a look at so many tutorials on that theme but in general they are all limited to creating a CRUD ...
Read more

How to test a Ruby on Rails REST API using Chrome's ...

How to test a Ruby on Rails REST API using Chrome's extension Advanced Rest Client. up vote 1 down vote favorite. ... Ruby on Rails - RESTful API ...
Read more

Getting Started with Rails — Ruby on Rails Guides

Getting Started with Rails. This guide covers getting up and running with Ruby on Rails. After reading this guide, you will know: How to install Rails ...
Read more

REST Plugin - Apache Struts

The REST plugin provides an alternative implementation, RestActionMapper, that provides the RESTful logic that maps a URL to a give action class ( aka ...
Read more