SlideShare una empresa de Scribd logo
1 de 139
Descargar para leer sin conexión
{   Rails 3
Overview
A Lot Like
Rails 2.3
Quick Refresher
What Hasn’t
 Changed?
MVC
REST
Resources
Controllers
Migrations
AR Ideas
Big User-Facing
   Changes
File Structure
con g.ru
# This file is used by Rack-based
# servers to start the application.

require ::File.expand_path(
  '../config/environment',
  __FILE__
)

run Tutorial::Application
con g/boot.rb
require 'rubygems'

# Set up gems listed in the Gemfile.
gemfile = File.expand_path(
  '../../Gemfile',
  __FILE__
)

if File.exist?(gemfile)
  ENV['BUNDLE_GEMFILE'] = gemfile
  require 'bundler'
  Bundler.setup
end
Gem le
source 'http://rubygems.org'

gem 'rails', '3.0.0.beta3'
gem 'sqlite3-ruby',
    :require => 'sqlite3'
con g/environment.rb
# Load the rails application
require File.expand_path(
  '../application',
  __FILE__
)

# Initialize the rails application
Tutorial::Application.initialize!
con g/application.rb (1)
require File.expand_path(
  '../boot',
  __FILE__
)

require 'rails/all'

if defined?(Bundler)
  Bundler.require(:default, Rails.env)
end
con g/application.rb (2)
module Tutorial
  class Application < Rails::Application
    config.encoding = "utf-8"
    config.filter_parameters +=
      [:password]
  end
end
environments/production.rb
Tutorial::Application.configure do
  config.cache_classes = true
  config.consider_all_requests_local = false
  config.action_controller.perform_caching =
    true
  config.action_dispatch.x_sendfile_header =
    "X-Sendfile"
  config.serve_static_assets = false
end
initializers/session_store.rb
Rails.application.
  config.session_store(
    :cookie_store,
    :key => '_tutorial_session'
  )
script/rails (1)
#!/usr/bin/env ruby
# This command will automatically
# be run when you run "rails" with
# Rails 3 gems installed from the
# root of your application.

ENV_PATH = File.expand_path(
  '../../config/environment',
  __FILE__
)
script/rails (2)
BOOT_PATH = File.expand_path(
  '../../config/boot',
  __FILE__
)

APP_PATH = File.expand_path(
  '../../config/application',
  __FILE__
)

require BOOT_PATH
require 'rails/commands'
app/mailers
$ script/rails g mailer welcome
  create app/mailers/welcome.rb
  invoke erb
  create    app/views/welcome
  invoke test_unit
  create    test/functional/welcome_test.rb
app/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>Tutorial</title>
  <%= stylesheet_link_tag :all %>
  <%= javascript_include_tag :defaults %>
  <%= csrf_meta_tag %>
</head>
<body>

<%= yield %>

</body>
</html>
public/
javascripts/
   rails.js
github.com/
rails/jquery-ujs
db/seeds.rb
rake db:setup
db:create
db:schema:load
    db:seed
lib/tasks/setup.rake
task :bundle do
  system "bundle install"
end

task :setup => ["bundle", "db:setup"]
Rails Command

★ generate   | g   ★ destroy
★ console    | c   ★ benchmarker
★ server     | s   ★ profiler
★ dbconsole | db   ★ plugin
★ application      ★ runner
Block Helpers
Block Helpers (Before)
<% form_for @post do |f| %>
<% end %>
Block Helpers (Before)
<% box do %>
  <p>Hello World!</p>
<% end %>
Block Helpers (Before)
def box(&block)
  content = "<div class='box'>" <<
    capture(&block) << "</div>"

  if block_called_from_erb?
    concat(content)
  else
    content
  end
end
Block Helpers (After)
<%= box do %>
  <p>Hello World!</p>
<% end %>
Block Helpers (After)
def box(&block)
  "<div class='box'>" 
  "#{capture(&block)}" 
  "</div>"
end
Block Helpers (After)
def box(&block)
  "<div class='box'>" 
  "#{capture(&block)}" 
  "</div>".html_safe
end
Router
Note:
  Signi cant
Changes Ahead
Also Note:
 Old Mapper
Still Available
Matching
map.connect "posts",
  :controller => :posts,
  :action => :index
Matching
map.connect "posts",
  :controller => :posts,
  :action => :index

match "posts" => "posts#index"
Matching
map.connect "posts",
  :controller => :posts,
  :action => :index

match "/posts" => "posts#index"
Optional Segments
match "/posts(/page)" => "posts#index"
Optional Dynamic Segments
match "/posts(/:id)" => "posts#index"
Default Parameters
match "/posts(/:id)" => "posts#index",
      :defaults => {:id => 1}
Default Parameters
match "/posts(/:id)" => "posts#index",
      :id => 1
Named Routes
match "/posts(/:id)" => "posts#index",
      :id => 1,
      :as => "posts"
The Root
root :to => "posts#index"
Scopes
Path Scope
match "/admin/posts" => "posts#index"
match "/admin/users" => "users#index"
Path Scope
scope :path => "admin" do
  match "/posts" => "posts#index"
  match "/users" => "users#index"
end
Path Scope
scope "admin" do
  match "/posts" => "posts#index"
  match "/users" => "users#index"
end
Module Scope
match "/posts" => "admin/posts#index"
match "/users" => "admin/users#index"
Module Scope
scope :module => "admin" do
  match "/posts" => "posts#index"
  match "/users" => "users#index"
end
Both
match "admin/posts" => "admin/posts#index"
match "admin/users" => "admin/users#index"
Both
namespace "admin" do
  match "/posts" => "posts#index"
  match "/users" => "users#index"
end
HTTP Methods
Get Request
match "/posts" => "posts#index",
      :via => "get"
Get Request
get "/posts" => "posts#index"
Scoping
scope "/posts" do
  controller :posts do
    get "/" => :index
  end
end
Scoping
get "/posts" => "posts#index"
Default Resource Route
controller :posts do
  scope "/posts" do
    get    "/"          =>   :index
    post   "/"          =>   :create
    get    "/:id"       =>   :show
    put    "/:id"       =>   :update
    delete "/:id"       =>   :delete

    get   "/new"        => :new
    get   "/:id/edit"   => :edit
  end
end
Default Resource Route
controller :posts do
  scope "/posts" do
    get    "/"           =>   :index,   :as => :posts
    post   "/"           =>   :create
    get    "/:id"        =>   :show,    :as => :post
    put    "/:id"        =>   :update
    delete "/:id"        =>   :delete

    get    "/new"        => :new,       :as => :new_post
    get    "/:id/edit"   => :edit,      :as => :edit_post
  end
end
Constraints
Regex Constraint
get "/:id" => "posts#index",
  :constraints => {:id => /d+/}
Regex Constraint
get "/:id" => "posts#index",
    :id => /d+/
Request-Based Constraint
get "/mobile" => "posts#index",
  :constraints => {:user_agent => /iPhone/}
Request-Based Constraint
get "/mobile" => "posts#index",
  :constraints => {:user_agent => /iPhone/},
  :defaults    => {:mobile      => true}
Request-Based Constraint
get "/mobile" => "posts#index",
  :user_agent => /iPhone/,
  :mobile     => true
Object Constraints
class DubDubConstraint
  def self.matches?(request)
    request.host =~ /^(www.)/
  end
end

get "/" => "posts#index",
    :constraints => DubDubConstraint
Rack
Equivalent
get "/posts" => "posts#index"

get "/posts" =>
    PostsController.action(:index)
Rack
>> a = PostsController.action(:index)
Rack
>> a = PostsController.action(:index)
=> #<Proc:0x0000000103d050d0@/Users/
wycats/Code/rails/actionpack/lib/
action_controller/metal.rb:123>
Rack
>> a = PostsController.action(:index)
=> #<Proc:0x0000000103d050d0@/Users/
wycats/Code/rails/actionpack/lib/
action_controller/metal.rb:123>
>> e = Rack::MockRequest.env_for("/")
Rack
>> a = PostsController.action(:index)
=> #<Proc:0x0000000103d050d0@/Users/
wycats/Code/rails/actionpack/lib/
action_controller/metal.rb:123>
>> e = Rack::MockRequest.env_for("/")
=> {"SERVER_NAME"=>"example.org",
"CONTENT_LENGTH"=>"0", ...}
Rack
>> a = PostsController.action(:index)
=> #<Proc:0x0000000103d050d0@/Users/
wycats/Code/rails/actionpack/lib/
action_controller/metal.rb:123>
>> e = Rack::MockRequest.env_for("/")
=> {"SERVER_NAME"=>"example.org",
"CONTENT_LENGTH"=>"0", ...}
>> e.call(a)
Rack
>> a = PostsController.action(:index)
=> #<Proc:0x0000000103d050d0@/Users/
wycats/Code/rails/actionpack/lib/
action_controller/metal.rb:123>
>> e = Rack::MockRequest.env_for("/")
=> {"SERVER_NAME"=>"example.org",
"CONTENT_LENGTH"=>"0", ...}
>> e.call(a)
=> [200, {"ETag"=>
‘"eca5953f36da05ff351d712d904ef28d"’,
...}
Match to Rack
class MyApp
  def call(env)
    [200,
      {"Content-Type" => "text/html"},
      ["Hello World"]]
  end
end

get "/" => MyApp
Redirection
get "/" => redirect("/foo")
Redirection
get "/" => redirect("/foo")

get "/:id" => redirect("/posts/%{id}")
get "/:id" => redirect("/posts/%s")
Redirection
get "/" => redirect("/foo")

get "/:id" => redirect("/posts/%{id}")
get "/:id" => redirect("/posts/%s")

get "/:id" => redirect { |params, req|
  ...
}
Rack App
def redirect(*args, &block)
  options = args.last.is_a?(Hash) ? args.pop : {}

  path        =   args.shift || block
  path_proc   =   path.is_a?(Proc) ? path : proc { |params| path % params }
  status      =   options[:status] || 301
  body        =   'Moved Permanently'

  lambda do |env|
    req = Request.new(env)

    params = [req.symbolized_path_parameters]
    params << req if path_proc.arity > 1

    uri = URI.parse(path_proc.call(*params))
    uri.scheme ||= req.scheme
    uri.host   ||= req.host
    uri.port   ||= req.port unless req.port == 80

    headers = {
      'Location' => uri.to_s,
      'Content-Type' => 'text/html',
      'Content-Length' => body.length.to_s
    }
    [ status, headers, [body] ]
  end
end
Rack App
def redirect(*args, &block)
  options = args.last.is_a?(Hash) ? args.pop : {}

  path        =   args.shift || block
  path_proc   =   path.is_a?(Proc) ? path : proc { |params| path % params }
  status      =   options[:status] || 301
  body        =   'Moved Permanently'

  lambda do |env|
    req = Request.new(env)

    redirect(*args, &block)
    params = [req.symbolized_path_parameters]
    params << req if path_proc.arity > 1

    uri = URI.parse(path_proc.call(*params))
    uri.scheme ||= req.scheme
    uri.host   ||= req.host
    uri.port   ||= req.port unless req.port == 80

    headers = {
      'Location' => uri.to_s,
      'Content-Type' => 'text/html',
      'Content-Length' => body.length.to_s
    }
    [ status, headers, [body] ]
  end
end
Rack App
lambda do |env|
  req = Request.new(env)

  params = [req.symbolized_path_parameters]
  params << req if path_proc.arity > 1

  uri = URI.parse(path_proc.call(*params))
  uri.scheme ||= req.scheme
  uri.host   ||= req.host
  uri.port   ||= req.port unless req.port == 80

  headers = {
    'Location' => uri.to_s,
    'Content-Type' => 'text/html',
    'Content-Length' => body.length.to_s
  }
  [ status, headers, [body] ]
end
Resources
Resources
resources :magazines do
  resources :ads
end
Member Resources
resources :photos do
  member do
    get :preview
    get :print
  end
end
One-Offs
resources :photos do
  get :preview, :on => :member
end
Collections
resources :photos do
  collection do
    get :search
  end
end
Combination
scope :module => "admin" do
  constraints IpBlacklist do
    resources :posts, :comments
  end
end
ActiveRecord
New Chainable,
  Lazy API
Chainable Methods

★ select        ★ order
★ from          ★ limit
★ where         ★ offset
★ joins         ★ includes
★ having        ★ lock
★ group         ★ readonly
Controller
def index
  @posts = Post.
    where(:published => true).
    order("publish_date desc")
end
Model
scope :published,
  where(:published => true).
  order("publish_date desc")
Model
scope :desc,
  order("publish_date desc")

scope :published,
  where(:published => true).desc
Controller
def index
  @posts = Post.
    where("created_at < ?", Time.now).
    order("publish_date desc")
end
Model
scope :desc,
  order("publish_date desc")

def self.past
  where("created_at < ?",
    Time.now).desc
end
Model
scope :desc,
  order("publish_date desc")

def self.past
  where("created_at < ?",
    Time.now).desc
end

def self.recent(number)
  past.limit(5)
end
Pagination
class PostsController
  def index
    @posts = Posts.page(5, :per_page => 10)
  end
end

class Post < ActiveRecord::Base
  def self.page(number, options)
    per_page = options[:per_page]

    offset(per_page * (number - 1)).
      limit(per_page)
  end
end
named_scope

with_scope

   nd(:all)
scope
ActionMailer
Massive API
 Overhaul
Sending Emails
def welcome(user)
  @user = user
  mail(:to => user.email,
       :subject => "Welcome man!")
end
welcome.text.erb

welcome.html.erb
Layouts
layout "rails_dispatch"

def welcome(user)
  @user = user
  mail(:to => user.email,
       :subject => "Welcome man!")
end
rails_dispatch.text.erb

rails_dispatch.html.erb
Be More Speci c
def welcome(user)
  @user = user
  mail(:to => user.email,
  :subject => "Welcome man!") do |format|
    format.html
    format.text { render "generic" }
  end
end
Defaults
default :from => "wycats@gmail.com"

def welcome(user)
  @user = user
  mail(:to => user.email,
  :subject => "Welcome man!") do |format|
    format.html
    format.text { render "generic" }
  end
end
Attachments
def welcome(user)
  @user = user

  file = Rails.public_path.join("hello.pdf")
  contents = File.readfile)
  attachments["welcome.pdf"] = contents

  mail(:to => user.email,
       :subject => "Welcome man!")
end
Interceptors
class MyInterceptor
  def self.delivering_email(mail)
    original = mail.to
    mail.to = "wycats@gmail.com"

    mail.subject =
      "#{original}: #{mail.subject}"
  end
end
Interceptors
class MyInterceptor
  def self.delivering_email(mail)
    original = mail.to
    mail.to = "wycats@gmail.com"

    mail.subject =
      "#{original}: #{mail.subject}"
  end
end

config.action_mailer.
  register_interceptor(MyInterceptor)
Interceptors

 Delivery

 Observers
delivering_mail

    deliver

delivered_mail
Bundler
gembundler.com
gembundler.com
  /rails3.html
railsdispatch.com
 /posts/bundler
yehudakatz.com/
2010/04/12/some-of-
   the-problems-
   bundler-solves/
yehudakatz.com/
2010/04/17/ruby-
 require-order-
   problems/
Choices
rspec-rails
generators

    rake tasks

controller_example

  view_example

request_example

 mailer_example
Mailer Generator
$ script/rails g mailer welcome
  create app/mailers/welcome.rb
  invoke erb
  create    app/views/welcome
  invoke rspec
  create    spec/mailers/welcome_spec.rb
dm-rails
generators

      rake tasks

append_info_to_payload

      i18n_scope

IdentityMap middleware
generate a resource
$ rails g resource comment
  invoke data_mapper
  create    app/models/comment.rb
  invoke    test_unit
  create      test/unit/comment_test.rb
  create      test/fixtures/comments.yml
  invoke controller
  create    app/controllers/comments_controller.rb
  invoke    erb
  create      app/views/commentses
  invoke    test_unit
  create      test/functional/comments_controller_test.rb
  invoke    helper
  create      app/helpers/commentses_helper.rb
  invoke      test_unit
  create        test/unit/helpers/comments_helper_test.rb
  route resources :commentses
generate a resource
$ rails g resource comment
  invoke data_mapper
  create    app/models/comment.rb
  invoke    rspec
  create      spec/models/comment_spec.rb
  invoke controller
  create    app/controllers/comments_controller.rb
  invoke    erb
  create      app/views/comments
  invoke    rspec
  create      spec/controllers/comments_controller_spec.rb
  create      spec/views/comments
  invoke    helper
  create      app/helpers/comments_helper.rb
  invoke      rspec
  route resources :comments
rails g
$ rails g                     stylesheets

Rails:                      DataMapper:
  controller                  data_mapper:migration
  generator                   data_mapper:model
  helper                      data_mapper:observer
  integration_test
  mailer                    Rspec:
  metal                       rspec:controller
  migration                   rspec:helper
  model                       rspec:install
  observer                    rspec:integration
  performance_test            rspec:mailer
  plugin                      rspec:model
  resource                    rspec:observer
  scaffold                    rspec:scaffold
  scaffold_controller         rspec:view
  session_migration
Rails 3 overview

Más contenido relacionado

La actualidad más candente

Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2RORLAB
 
Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
 Connecting Content Silos: One CMS, Many Sites With The WordPress REST API Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
Connecting Content Silos: One CMS, Many Sites With The WordPress REST APICaldera Labs
 
Layouts and Rendering in Rails, Season 2
Layouts and Rendering in Rails, Season 2Layouts and Rendering in Rails, Season 2
Layouts and Rendering in Rails, Season 2RORLAB
 
A Little Backbone For Your App
A Little Backbone For Your AppA Little Backbone For Your App
A Little Backbone For Your AppLuca Mearelli
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101Samantha Geitz
 
Caldera Learn - LoopConf WP API + Angular FTW Workshop
Caldera Learn - LoopConf WP API + Angular FTW WorkshopCaldera Learn - LoopConf WP API + Angular FTW Workshop
Caldera Learn - LoopConf WP API + Angular FTW WorkshopCalderaLearn
 
OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010ikailan
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackIgnacio Martín
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsAlessandro Molina
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreRyan Weaver
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weiboshaokun
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkJeremy Kendall
 
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...Caldera Labs
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Kris Wallsmith
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发shaokun
 
Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18Lar21
 
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Ryan Weaver
 

La actualidad más candente (20)

Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2Action View Form Helpers - 1, Season 2
Action View Form Helpers - 1, Season 2
 
Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
 Connecting Content Silos: One CMS, Many Sites With The WordPress REST API Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
Connecting Content Silos: One CMS, Many Sites With The WordPress REST API
 
Rails 4.0
Rails 4.0Rails 4.0
Rails 4.0
 
Django
DjangoDjango
Django
 
Layouts and Rendering in Rails, Season 2
Layouts and Rendering in Rails, Season 2Layouts and Rendering in Rails, Season 2
Layouts and Rendering in Rails, Season 2
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
A Little Backbone For Your App
A Little Backbone For Your AppA Little Backbone For Your App
A Little Backbone For Your App
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101
 
Caldera Learn - LoopConf WP API + Angular FTW Workshop
Caldera Learn - LoopConf WP API + Angular FTW WorkshopCaldera Learn - LoopConf WP API + Angular FTW Workshop
Caldera Learn - LoopConf WP API + Angular FTW Workshop
 
OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and Webpack
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weibo
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
 
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
Single Page Web Apps As WordPress Admin Interfaces Using AngularJS & The Word...
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3
 
Rails web api 开发
Rails web api 开发Rails web api 开发
Rails web api 开发
 
Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18
 
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
 

Similar a Rails 3 overview

Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編Masakuni Kato
 
I Phone On Rails
I Phone On RailsI Phone On Rails
I Phone On RailsJohn Wilker
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Joao Lucas Santana
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - IntroductionVagmi Mudumbai
 
All I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkAll I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkBen Scofield
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortalJennifer Bourey
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportBen Scofield
 
QConSP 2015 - Dicas de Performance para Aplicações Web
QConSP 2015 - Dicas de Performance para Aplicações WebQConSP 2015 - Dicas de Performance para Aplicações Web
QConSP 2015 - Dicas de Performance para Aplicações WebFabio Akita
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Railsrstankov
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareAlona Mekhovova
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From IusethisMarcus Ramberg
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowVrann Tulika
 

Similar a Rails 3 overview (20)

Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
 
I Phone On Rails
I Phone On RailsI Phone On Rails
I Phone On Rails
 
实战Ecos
实战Ecos实战Ecos
实战Ecos
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - Introduction
 
All I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkAll I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web Framework
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortal
 
Nodejs.meetup
Nodejs.meetupNodejs.meetup
Nodejs.meetup
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
JS-05-Handlebars.ppt
JS-05-Handlebars.pptJS-05-Handlebars.ppt
JS-05-Handlebars.ppt
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack Support
 
QConSP 2015 - Dicas de Performance para Aplicações Web
QConSP 2015 - Dicas de Performance para Aplicações WebQConSP 2015 - Dicas de Performance para Aplicações Web
QConSP 2015 - Dicas de Performance para Aplicações Web
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Rails
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request Flow
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 

Más de Yehuda Katz

Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performanceYehuda Katz
 
Writing Fast Client-Side Code: Lessons Learned from SproutCore
Writing Fast Client-Side Code: Lessons Learned from SproutCoreWriting Fast Client-Side Code: Lessons Learned from SproutCore
Writing Fast Client-Side Code: Lessons Learned from SproutCoreYehuda Katz
 
SproutCore: Amber
SproutCore: AmberSproutCore: Amber
SproutCore: AmberYehuda Katz
 
Organizing jQuery Projects Without OO
Organizing jQuery Projects Without OOOrganizing jQuery Projects Without OO
Organizing jQuery Projects Without OOYehuda Katz
 
Why You Shouldn't Write OO
Why You Shouldn't Write OO Why You Shouldn't Write OO
Why You Shouldn't Write OO Yehuda Katz
 
Making your oss project more like rails
Making your oss project more like railsMaking your oss project more like rails
Making your oss project more like railsYehuda Katz
 
Vaporware To Awesome
Vaporware To AwesomeVaporware To Awesome
Vaporware To AwesomeYehuda Katz
 
Merb Day Keynote
Merb Day KeynoteMerb Day Keynote
Merb Day KeynoteYehuda Katz
 
Merb Camp Keynote
Merb Camp KeynoteMerb Camp Keynote
Merb Camp KeynoteYehuda Katz
 
jQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksjQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksYehuda Katz
 
jQuery Presentation to Rails Developers
jQuery Presentation to Rails DevelopersjQuery Presentation to Rails Developers
jQuery Presentation to Rails DevelopersYehuda Katz
 

Más de Yehuda Katz (15)

Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
 
Writing Fast Client-Side Code: Lessons Learned from SproutCore
Writing Fast Client-Side Code: Lessons Learned from SproutCoreWriting Fast Client-Side Code: Lessons Learned from SproutCore
Writing Fast Client-Side Code: Lessons Learned from SproutCore
 
SproutCore: Amber
SproutCore: AmberSproutCore: Amber
SproutCore: Amber
 
Organizing jQuery Projects Without OO
Organizing jQuery Projects Without OOOrganizing jQuery Projects Without OO
Organizing jQuery Projects Without OO
 
Why You Shouldn't Write OO
Why You Shouldn't Write OO Why You Shouldn't Write OO
Why You Shouldn't Write OO
 
Making your oss project more like rails
Making your oss project more like railsMaking your oss project more like rails
Making your oss project more like rails
 
Vaporware To Awesome
Vaporware To AwesomeVaporware To Awesome
Vaporware To Awesome
 
Merb Day Keynote
Merb Day KeynoteMerb Day Keynote
Merb Day Keynote
 
Testing Merb
Testing MerbTesting Merb
Testing Merb
 
Merb jQuery
Merb jQueryMerb jQuery
Merb jQuery
 
Merb Camp Keynote
Merb Camp KeynoteMerb Camp Keynote
Merb Camp Keynote
 
Merb
MerbMerb
Merb
 
DataMapper
DataMapperDataMapper
DataMapper
 
jQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksjQuery and Ruby Web Frameworks
jQuery and Ruby Web Frameworks
 
jQuery Presentation to Rails Developers
jQuery Presentation to Rails DevelopersjQuery Presentation to Rails Developers
jQuery Presentation to Rails Developers
 

Último

Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 

Último (20)

Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 

Rails 3 overview