Desenvolvimento Web
com Ruby on Rails
Nuno Silva
@nunosilva800
www.whitesmith.co
● Criação
● Objectivos principais
● Inspirada em Perl,
Smalltalk, Eiffel, Ada
e Lisp
RUBY
Tudo é um objecto. Até os tipos primitivos!
irb> 3.times { puts "Eu amo Ruby <3" }
Eu amo Ruby <3
Eu amo Ruby <3
Eu amo Ruby <3
irb> nil.inspect
=> "nil"
irb> nil.to_s
=> ""
irb> nil.to_i
=> 0
irb> nil.nil?
=> true
irb> 3.14159.negative?
=> false
irb> 1_500_000 == 1500000
=> true
RUBY
Tudo é um objecto. Até os tipos primitivos!
irb> [1,2,3].max
=> 3
irb> soma = 0
irb> [1,2,3].each { |n| soma += n }
irb> soma
=> 6
irb> [1,2,3].inject { |acc, n| acc += n }
=> 6
irb> [1,2,3].inject(&:+)
=> 6
RUBY
Tudo é um objecto. Até os tipos primitivos!
irb> my_hash = {a: 1, b: 'foo', c: [1,2,3]}
=> {:a=>1, :b=>"foo", :c=>[1, 2, 3]}
irb> my_hash[:b]
=> "foo"
irb> my_hash.values
=> [1, "foo", [1, 2, 3]]
RUBY
Semelhanças
● Garbage Collector
● Tipagem forte
○ Ruby: dinâmica / Java: estática
● Public, Private, Protected methods
DO JAVA PARA O RUBY
Diferenças
● Sem compilação (interpretado)
● end ao invés de colchetes {}
● require ao invés de import
● Sem declarações de tipos a = [1,2,3]vs int[] a = {1,2,3};
● foo = Foo.new("hi") ao invés de Foo foo = new Foo("hi")
● Construtor é sempre chamado de initialize
● Variáveis de instância são todas privadas
DO JAVA PARA O RUBY
class Animal
def say
nil
end
end
class Dog < Animal
def say
'Woff'
end
end
class Fox < Animal
# what does the fox say?
end
> Animal.new.say
=> nil
> Dog.new.say
=> "Woff"
> Fox.new.say
=> nil
RUBY
class Counter
def initialize
@value = 0
end
def add
@value += 1
end
def current
@value
end
end
> counter = Counter.new
=> #<Counter:0x000000034ca448
@value=0>
> counter.current
=> 0
> counter.add
=> 1
> counter.current
=> 1
> counter.value
NoMethodError: undefined method `value'
> counter.@value
SyntaxError:
RUBY
● Matz’s Ruby Interpreter (MRI) / CRuby
○ Oficial, implementado em C
○ Acesso a bibliotecas escritas em C
● JRuby
○ Implementado em Java, roda na JVM
○ Acesso a bibliotecas escritas em Java
● RubyMotion
○ Implementado em Objective-C / Cocoa
○ Gera binários nativos para iOS, OS X e Android
● mruby
○ Versão embutível do MRI, para sistemas embarcados
○ Ideal para rodar Ruby em Raspberry Pi, IoTs, etc.
Interpretadores Ruby
RUBY
Rubygems.org
$ gem install bundler
Fetching: bundler-1.13.5.gem (100%)
Successfully installed bundler-1.13.5
Bundler.io
source 'https://rubygems.org'
gem 'rails'
gem 'jquery-rails', '~> 3.1.3'
$ bundle install
Fetching gem metadata from https://rubygems.org/.....
RUBY
O que é o Ruby on Rails?
● Framework para desenvolvimento Web
● Open source
● Full-stack: do banco de dados ao cliente (browser)
● RESTful
● Valoriza a convenção ao invés da configuração
RUBY ON RAILS
$ gem install rails
$ rails new semana-academica --database=postgresql
$ cd semana-academica
├── app
├── bin
├── config
├── db
├── Gemfile
├── Gemfile.lock
├── lib
├── log
├── public
├── test
└── vendor
app/
├── assets
├── channels
├── controllers
├── helpers
├── jobs
├── mailers
├── models
└── views
RUBY ON RAILS
$ rails db:create
$ rails server
$ xdg-open http://localhost:3000
RUBY ON RAILS
$ rails generate scaffold post title:string body:text
invoke active_record
create db/migrate/20161017203634_create_posts.rb
create app/models/post.rb
invoke resource_route
route resources :posts
invoke scaffold_controller
create app/controllers/posts_controller.rb
invoke erb
create app/views/posts
create app/views/posts/index.html.erb
create app/views/posts/edit.html.erb
create app/views/posts/show.html.erb
create app/views/posts/new.html.erb
create app/views/posts/_form.html.erb
invoke test_unit
create test/models/post_test.rb
create test/fixtures/posts.yml
create test/controllers/posts_controller_test.rb
RUBY ON RAILS
$ rails db:migrate
$ rails server
Demo Time!
RUBY ON RAILS
MVC - Camada de dados + modelos
class CreatePosts < ActiveRecord::Migration[5.0]
def change
create_table :posts do |t|
t.string :title
t.text :body
t.timestamps
end
end
end
class Post < ApplicationRecord
end
RUBY ON RAILS
MVC - Camada de controladores + rotas
$ rails routes
Prefix Verb URI Pattern Controller#Action
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
Rails.application.routes.draw do
resources :posts
end
RUBY ON RAILS
MVC - Camada de controladores + rotas
class PostsController < ApplicationController
# GET /posts
# GET /posts.json
def index
@posts = Post.all
end
# GET /posts/1
# GET /posts/1.json
def show
@post = Post.find(params[:id])
end
# GET /posts/new
def new
@post = Post.new
end
RUBY ON RAILS
MVC - Camada de visão
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<p>
<strong>Body:</strong>
<%= @post.body %>
</p>
<%= link_to 'Edit', edit_post_path(@post) %> |
<%= link_to 'Back', posts_path %>
$ cat semana-academica/app/views/posts/show.html.erb
RUBY ON RAILS
MVC - Camada de visão
json.partial! "posts/post", post: @post
json.extract! post, :id, :title, :body, :created_at, :updated_at
json.url post_url(post, format: :json)
$ curl http://localhost:3000/posts/1.json
{"id":1,"title":"Olá Unitins","body":"Semana acadêmica
o/","created_at":"2016-10-17T21:20:05.247Z","updated_at":"2016-1
0-17T21:20:05.247Z","url":"http://localhost:3000/posts/1.json"}
$ cat semana-academica/app/views/posts/show.json.jbuilder
$ cat semana-academica/app/views/posts/_post.json.jbuilder
RUBY ON RAILS
$ rails console
> Post.count
(0.2ms) SELECT COUNT(*) FROM "posts"
=> 1
> Post.first
Post Load (0.6ms) SELECT "posts".* FROM "posts" ORDER BY
"posts"."id" ASC LIMIT $1 [["LIMIT", 1]]
=> #<Post id: 1, title: "Olá Unitins", body: "Semana acadêmica
o/",...>
> Post.where(created_at: (Date.today - 1.day)..(Date.today + 1.day)).count
(0.8ms) SELECT COUNT(*) FROM "posts" WHERE ("posts"."created_at" BETWEEN $1
AND $2) [["created_at", Sun, 16 Oct 2016], ["created_at", Tue, 18 Oct 2016]]
=> 1
RUBY ON RAILS
E como
é lá
fora?
Construído com Ruby on Rails até ~ 2011.
Trocaram para Scala devido à enorme demanda.
Obrigado!
Nuno Silva
@nunosilva800
www.whitesmith.co
Do Java para Ruby
Performance
Ruby 2.3 ~ 4% mais lento que Java 8
https://github.com/famzah/langs-performance
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=yarv&lang2=java

Quick introduction to Ruby on Rails

  • 1.
    Desenvolvimento Web com Rubyon Rails Nuno Silva @nunosilva800 www.whitesmith.co
  • 4.
    ● Criação ● Objectivosprincipais ● Inspirada em Perl, Smalltalk, Eiffel, Ada e Lisp RUBY
  • 5.
    Tudo é umobjecto. Até os tipos primitivos! irb> 3.times { puts "Eu amo Ruby <3" } Eu amo Ruby <3 Eu amo Ruby <3 Eu amo Ruby <3 irb> nil.inspect => "nil" irb> nil.to_s => "" irb> nil.to_i => 0 irb> nil.nil? => true irb> 3.14159.negative? => false irb> 1_500_000 == 1500000 => true RUBY
  • 6.
    Tudo é umobjecto. Até os tipos primitivos! irb> [1,2,3].max => 3 irb> soma = 0 irb> [1,2,3].each { |n| soma += n } irb> soma => 6 irb> [1,2,3].inject { |acc, n| acc += n } => 6 irb> [1,2,3].inject(&:+) => 6 RUBY
  • 7.
    Tudo é umobjecto. Até os tipos primitivos! irb> my_hash = {a: 1, b: 'foo', c: [1,2,3]} => {:a=>1, :b=>"foo", :c=>[1, 2, 3]} irb> my_hash[:b] => "foo" irb> my_hash.values => [1, "foo", [1, 2, 3]] RUBY
  • 8.
    Semelhanças ● Garbage Collector ●Tipagem forte ○ Ruby: dinâmica / Java: estática ● Public, Private, Protected methods DO JAVA PARA O RUBY
  • 9.
    Diferenças ● Sem compilação(interpretado) ● end ao invés de colchetes {} ● require ao invés de import ● Sem declarações de tipos a = [1,2,3]vs int[] a = {1,2,3}; ● foo = Foo.new("hi") ao invés de Foo foo = new Foo("hi") ● Construtor é sempre chamado de initialize ● Variáveis de instância são todas privadas DO JAVA PARA O RUBY
  • 10.
    class Animal def say nil end end classDog < Animal def say 'Woff' end end class Fox < Animal # what does the fox say? end > Animal.new.say => nil > Dog.new.say => "Woff" > Fox.new.say => nil RUBY
  • 11.
    class Counter def initialize @value= 0 end def add @value += 1 end def current @value end end > counter = Counter.new => #<Counter:0x000000034ca448 @value=0> > counter.current => 0 > counter.add => 1 > counter.current => 1 > counter.value NoMethodError: undefined method `value' > counter.@value SyntaxError: RUBY
  • 12.
    ● Matz’s RubyInterpreter (MRI) / CRuby ○ Oficial, implementado em C ○ Acesso a bibliotecas escritas em C ● JRuby ○ Implementado em Java, roda na JVM ○ Acesso a bibliotecas escritas em Java ● RubyMotion ○ Implementado em Objective-C / Cocoa ○ Gera binários nativos para iOS, OS X e Android ● mruby ○ Versão embutível do MRI, para sistemas embarcados ○ Ideal para rodar Ruby em Raspberry Pi, IoTs, etc. Interpretadores Ruby RUBY
  • 13.
    Rubygems.org $ gem installbundler Fetching: bundler-1.13.5.gem (100%) Successfully installed bundler-1.13.5 Bundler.io source 'https://rubygems.org' gem 'rails' gem 'jquery-rails', '~> 3.1.3' $ bundle install Fetching gem metadata from https://rubygems.org/..... RUBY
  • 15.
    O que éo Ruby on Rails? ● Framework para desenvolvimento Web ● Open source ● Full-stack: do banco de dados ao cliente (browser) ● RESTful ● Valoriza a convenção ao invés da configuração RUBY ON RAILS
  • 16.
    $ gem installrails $ rails new semana-academica --database=postgresql $ cd semana-academica ├── app ├── bin ├── config ├── db ├── Gemfile ├── Gemfile.lock ├── lib ├── log ├── public ├── test └── vendor app/ ├── assets ├── channels ├── controllers ├── helpers ├── jobs ├── mailers ├── models └── views RUBY ON RAILS
  • 17.
    $ rails db:create $rails server $ xdg-open http://localhost:3000 RUBY ON RAILS
  • 18.
    $ rails generatescaffold post title:string body:text invoke active_record create db/migrate/20161017203634_create_posts.rb create app/models/post.rb invoke resource_route route resources :posts invoke scaffold_controller create app/controllers/posts_controller.rb invoke erb create app/views/posts create app/views/posts/index.html.erb create app/views/posts/edit.html.erb create app/views/posts/show.html.erb create app/views/posts/new.html.erb create app/views/posts/_form.html.erb invoke test_unit create test/models/post_test.rb create test/fixtures/posts.yml create test/controllers/posts_controller_test.rb RUBY ON RAILS
  • 19.
    $ rails db:migrate $rails server Demo Time! RUBY ON RAILS
  • 20.
    MVC - Camadade dados + modelos class CreatePosts < ActiveRecord::Migration[5.0] def change create_table :posts do |t| t.string :title t.text :body t.timestamps end end end class Post < ApplicationRecord end RUBY ON RAILS
  • 21.
    MVC - Camadade controladores + rotas $ rails routes Prefix Verb URI Pattern Controller#Action posts GET /posts(.:format) posts#index POST /posts(.:format) posts#create new_post GET /posts/new(.:format) posts#new edit_post GET /posts/:id/edit(.:format) posts#edit post GET /posts/:id(.:format) posts#show PATCH /posts/:id(.:format) posts#update PUT /posts/:id(.:format) posts#update DELETE /posts/:id(.:format) posts#destroy Rails.application.routes.draw do resources :posts end RUBY ON RAILS
  • 22.
    MVC - Camadade controladores + rotas class PostsController < ApplicationController # GET /posts # GET /posts.json def index @posts = Post.all end # GET /posts/1 # GET /posts/1.json def show @post = Post.find(params[:id]) end # GET /posts/new def new @post = Post.new end RUBY ON RAILS
  • 23.
    MVC - Camadade visão <p> <strong>Title:</strong> <%= @post.title %> </p> <p> <strong>Body:</strong> <%= @post.body %> </p> <%= link_to 'Edit', edit_post_path(@post) %> | <%= link_to 'Back', posts_path %> $ cat semana-academica/app/views/posts/show.html.erb RUBY ON RAILS
  • 24.
    MVC - Camadade visão json.partial! "posts/post", post: @post json.extract! post, :id, :title, :body, :created_at, :updated_at json.url post_url(post, format: :json) $ curl http://localhost:3000/posts/1.json {"id":1,"title":"Olá Unitins","body":"Semana acadêmica o/","created_at":"2016-10-17T21:20:05.247Z","updated_at":"2016-1 0-17T21:20:05.247Z","url":"http://localhost:3000/posts/1.json"} $ cat semana-academica/app/views/posts/show.json.jbuilder $ cat semana-academica/app/views/posts/_post.json.jbuilder RUBY ON RAILS
  • 25.
    $ rails console >Post.count (0.2ms) SELECT COUNT(*) FROM "posts" => 1 > Post.first Post Load (0.6ms) SELECT "posts".* FROM "posts" ORDER BY "posts"."id" ASC LIMIT $1 [["LIMIT", 1]] => #<Post id: 1, title: "Olá Unitins", body: "Semana acadêmica o/",...> > Post.where(created_at: (Date.today - 1.day)..(Date.today + 1.day)).count (0.8ms) SELECT COUNT(*) FROM "posts" WHERE ("posts"."created_at" BETWEEN $1 AND $2) [["created_at", Sun, 16 Oct 2016], ["created_at", Tue, 18 Oct 2016]] => 1 RUBY ON RAILS
  • 26.
  • 28.
    Construído com Rubyon Rails até ~ 2011. Trocaram para Scala devido à enorme demanda.
  • 29.
  • 30.
    Do Java paraRuby Performance Ruby 2.3 ~ 4% mais lento que Java 8 https://github.com/famzah/langs-performance http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=yarv&lang2=java