SlideShare uma empresa Scribd logo
{   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

Mais conteúdo relacionado

Mais procurados

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
RORLAB
 
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
Caldera Labs
 
Rails 4.0
Rails 4.0Rails 4.0
Rails 4.0
Robert Gogolok
 
Django
DjangoDjango
Django
Ivan Widodo
 
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
RORLAB
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
Andréia Bohner
 
A Little Backbone For Your App
A Little Backbone For Your AppA Little Backbone For Your App
A Little Backbone For Your App
Luca Mearelli
 
REST APIs in Laravel 101
REST APIs in Laravel 101REST APIs in Laravel 101
REST APIs in Laravel 101
Samantha 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 Workshop
CalderaLearn
 
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
ikailan
 
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
Ignacio Martín
 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
Alessandro 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 more
Ryan Weaver
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weibo
shaokun
 
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
Jeremy 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.3
Kris 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 18
Lar21
 
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
 

Mais procurados (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...
 

Semelhante 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 Finish
Yehuda Katz
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
Daniel Cukier
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
Masakuni Kato
 
I Phone On Rails
I Phone On RailsI Phone On Rails
I Phone On Rails
John Wilker
 
实战Ecos
实战Ecos实战Ecos
实战Ecos
wanglei999
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
Michał Orman
 
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 - Introduction
Vagmi 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 Framework
Ben Scofield
 
Rich Portlet Development in uPortal
Rich Portlet Development in uPortalRich Portlet Development in uPortal
Rich Portlet Development in uPortal
Jennifer Bourey
 
Nodejs.meetup
Nodejs.meetupNodejs.meetup
Nodejs.meetup
Vivian S. Zhang
 
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
Lindsay Holmwood
 
JS-05-Handlebars.ppt
JS-05-Handlebars.pptJS-05-Handlebars.ppt
JS-05-Handlebars.ppt
fakeaccount225095
 
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
Ben 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 Web
Fabio Akita
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Rails
rstankov
 
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
Alona Mekhovova
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
Marcus Ramberg
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request Flow
Vrann Tulika
 
Mojolicious
MojoliciousMojolicious
Mojolicious
Marcos Rebelo
 

Semelhante 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
 

Mais de Yehuda Katz

Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
Yehuda 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 SproutCore
Yehuda Katz
 
SproutCore: Amber
SproutCore: AmberSproutCore: Amber
SproutCore: Amber
Yehuda Katz
 
Organizing jQuery Projects Without OO
Organizing jQuery Projects Without OOOrganizing jQuery Projects Without OO
Organizing jQuery Projects Without OO
Yehuda 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 rails
Yehuda Katz
 
Vaporware To Awesome
Vaporware To AwesomeVaporware To Awesome
Vaporware To Awesome
Yehuda Katz
 
Merb Day Keynote
Merb Day KeynoteMerb Day Keynote
Merb Day Keynote
Yehuda Katz
 
Testing Merb
Testing MerbTesting Merb
Testing Merb
Yehuda Katz
 
Merb jQuery
Merb jQueryMerb jQuery
Merb jQuery
Yehuda Katz
 
Merb Camp Keynote
Merb Camp KeynoteMerb Camp Keynote
Merb Camp Keynote
Yehuda Katz
 
Merb
MerbMerb
DataMapper
DataMapperDataMapper
DataMapper
Yehuda Katz
 
jQuery and Ruby Web Frameworks
jQuery and Ruby Web FrameworksjQuery and Ruby Web Frameworks
jQuery and Ruby Web Frameworks
Yehuda Katz
 
jQuery Presentation to Rails Developers
jQuery Presentation to Rails DevelopersjQuery Presentation to Rails Developers
jQuery Presentation to Rails Developers
Yehuda Katz
 

Mais 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

GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge GraphGraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
Neo4j
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
Fwdays
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Precisely
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
Miro Wengner
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
c5vrf27qcz
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Alpen-Adria-Universität
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
DianaGray10
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
Edge AI and Vision Alliance
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
Fwdays
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
Ivo Velitchkov
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
saastr
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
Safe Software
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
Jason Yip
 

Último (20)

GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge GraphGraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
GraphRAG for LifeSciences Hands-On with the Clinical Knowledge Graph
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
Artificial Intelligence and Electronic Warfare
Artificial Intelligence and Electronic WarfareArtificial Intelligence and Electronic Warfare
Artificial Intelligence and Electronic Warfare
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
Essentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation ParametersEssentials of Automations: Exploring Attributes & Automation Parameters
Essentials of Automations: Exploring Attributes & Automation Parameters
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
 

Rails 3 overview