Crash Course Ruby & Rails

Preview:

DESCRIPTION

Palestra ministrada no II Workshop de Software Livre do CInLUG em 25/03/2011. Introdução a Ruby e Rails. Ruby and Rails Introduction from Frevo on Rails User Group, Pernambuco, Brazil.

Citation preview

RUBY& RAILS

CRASH COURSEGUILHERME CARVALHO

LAILSON BANDEIRA

Programação

REQUISITOS

Orientação a objetos

Desenvolvimento web

RUBYON RAILS

framework web

linguagem

RUBY1995

Japão

Yukihiro Matsumoto

1.9.2 – 1.8.7

ORIENTADA A OBJETOSDINÂM

ICA

INTERPRETADA

MULTIPLATAFORMA

TIPAGEM FORTEMU

LTIPA

RADIG

MA

DUCK

SINTA

XE FL

EXÍVE

L

FUNCIONALREFLEXIVASOFTWARE LIVRE

EXTE

NSÍVE

L

PRINCIPLE OF LEAST ASTONISHMENTPLA

Ruby is designed to make programmers happy.“

”MATZ

RUBYPOR EXEMPLOS

> irbruby > 2+1 => 3 ruby > 3/2 # divisão inteira => 1 ruby > 3.0/2 # divisão real => 1.5 ruby > 3 > 2 => true

INTERACTIVE RUBY

ruby > "hello".class => String ruby > 1.class => Fixnum ruby > 1.2.class => Floatruby > 1.+(2) => 3

TUDO É OBJETO

ruby > usuario = "Maria" => "Maria" ruby > "Bem-vindo " + usuario => "Bem-vindo Maria"ruby > "Bem-vindo #{usuario}" => "Bem-vindo Maria" ruby > usuario = nil => nil

VARIÁVEIS E INTERPOLAÇÃO

ruby > numeros = [1,2,3,4] => [1, 2, 3, 4] ruby > linguagens = ['ruby', 'python'] => ["ruby", "python"] ruby > mix = [1, 'ruby', 2.5] => [1, "ruby", 2.5]ruby > linguagens[0] => "ruby"

ARRAYS

ruby > linguagens.sort => ["python", "ruby"] ruby > numeros.shuffle => [2, 4, 1, 3] ruby > mix[10] = 'longe' => "longe" ruby > mix => [1, "ruby", 2.5, nil, nil, nil, nil, nil, nil, nil, "longe"]

ARRAYS

ruby > quad = {'dois' => 4, 'tres' => 9} => {"dois"=>4, "tres"=>9} ruby > quad['dois'] => 4 ruby > quad['quatro'] = 16 => 16 ruby > quad => {"dois"=>4, "tres"=>9, "quatro"=>16}

HASHES

ruby > quad['cinco'] => nilruby > quad.size => 3 ruby > quad.keys => ["dois", "tres", "quatro"] ruby > quad.values => [4, 9, 16]

HASHES

ruby > :norte => :norte ruby > cidades = {:norte => 'olinda', :sul => 'jaboatão'} => {:norte=>"olinda", :sul=>"jaboatão"} ruby > cidades[:norte] => "olinda" ruby > cidades = {norte: 'olinda', sul: 'jaboatão'} # apenas 1.9 => {:norte=>"olinda", :sul=>"jaboatão"}

SÍMBOLOS

ruby > letras = 'a'..'e' => "a".."e" ruby > letras.include?('c') => true ruby > letras.include?('f') => false ruby > letras.to_a => ["a", "b", "c", "d", "e"]

RANGES

ruby > regex = /[a-z]+/ => /[a-z]+/ ruby > regex =~ 'cinlug' => 0 ruby > regex =~ '1234' => nil ruby > regex =~ '1 mais 2 igual a 3' => 2

EXPRESSÕES REGULARES

ruby > cep = /(\d{5})-(\d{3})/ => /(\d{5})-(\d{3})/ ruby > cep =~ '50740-540' => 0 ruby > $1 => "50740" ruby > cep.match('50740-540') => #<MatchData "50740-540" 1:"50740"...

EXPRESSÕES REGULARES

ruby > a,b = 1,2 => [1, 2] ruby > a,b = b,a => [2, 1] ruby > a,b,c = [1,2,3] => [1, 2, 3] ruby > a => 1

ATRIBUIÇÃO

> ruby nome_do_arquivo.rbputs "Olá, mundo"print 'Digite seu nome: 'nome = getsputs "Olá, #{nome}"

EXECUTANDO UM PROGRAMA

usuario = 'Maria'sexo = :femininoif sexo == :masculino saudacao = 'Bem-vindo'elsif sexo == :feminino saudacao = 'Bem-vinda'else saudacao = 'WTF!'endputs "#{saudacao} #{usuario}"

CONDICIONAIS

usuario = 'Maria'sexo = :femininosaudacao = if sexo == :masculino 'Bem-vindo'elsif sexo == :feminino 'Bem-vinda'else 'WTF!'endputs "#{saudacao} #{usuario}"

CONDICIONAIS

usuario = 'Maria'sexo = :feminino# ...if sexo == :feminino puts "#{saudacao} #{usuario}"end

CONDICIONAIS

usuario = 'Maria'sexo = :feminino# ...puts "#{saudacao} #{usuario}" if sexo == :feminino

CONDICIONAIS

# ...usuario = nilif not usuario puts "Sem usuário para cumprimentar"else puts "#{saudacao} #{usuario}"end

CONDICIONAIS

# ...usuario = nilunless usuario puts "Sem usuário para cumprimentar"else puts "#{saudacao} #{usuario}"end

CONDICIONAIS

i = 0while i < 4 puts "Imprimindo linha #{i}..." i += 1end

LOOPS

i = 0until i >= 4 puts "Imprimindo linha #{i}..." i += 1end

LOOPS

4.times do |i| puts "Imprimindo linha #{i}..."end

LOOPS

numeros = [1,2,3,4]numeros.each do |n| puts nend

LOOPS

numeros = [1,2,3,4]for n in numeros puts nend

LOOPS

cidades = {norte: 'olinda', sul: 'jaboatão'}cidades.each do |chave,valor| puts "ao #{chave} fica #{valor}"end

LOOPS

cidades = {norte: 'olinda', sul: 'jaboatão'}for chave, valor in cidades puts "ao #{chave} fica #{valor}"end

LOOPS

numeros = [1,2,3,4]quad = numeros.map do |n| n**2endputs quad

CONSTRUÇÕES FUNCIONAIS

numeros = [1,2,3,4]soma = numeros.reduce do |memo, n| memo += nendputs soma

CONSTRUÇÕES FUNCIONAIS

numeros = [1,2,3,4]soma = numeros.reduce(&:+)puts soma

CONSTRUÇÕES FUNCIONAIS

def quad(n,e) return n**eendputs quad(3,2)

DEFINIÇÃO DE MÉTODOS

def quad(n,e) n**eendputs quad(3,2)

DEFINIÇÃO DE MÉTODOS

def quad(n,e) n**eendputs quad 3,2

DEFINIÇÃO DE MÉTODOS

def quad(n,e=2) # valor padrão n**eendputs quad 3

DEFINIÇÃO DE MÉTODOS

def fatorial(n) return 1 if n <= 1 n * fatorial(n-1)endputs fatorial(5)

CHAMADA DE MÉTODOS

def imprimir(hash) puts hash.inspectendputs imprimir({'a' => 1, 'b' => 2})

CHAMADA DE MÉTODOS

def imprimir(hash) puts hash.inspectendputs imprimir( 'a' => 1, 'b' => 2 )

CHAMADA DE MÉTODOS

class Usuario def initialize(nome) @nome = nome endendusuario = Usuario.new('lailson')

CLASSES

class Usuario # ... def nome @nome end endusuario = Usuario.new('lailson')puts usuario.nome

CLASSES

class Usuario # ... def nome=(valor) @nome = valor endendusuario = Usuario.new('lailson')usuario.nome = 'Lailson'puts usuario.nome

CLASSES

class Usuario attr_reader :nome attr_writer :nome # ...endusuario = Usuario.new('lailson')usuario.nome = 'Lailson'puts usuario.nome

CLASSES

class Usuario attr_accessor :nome # ...endusuario = Usuario.new('lailson')usuario.nome = 'Lailson'puts usuario.nome

CLASSES

class Usuario attr_accessor :nome, :idade # ... def maior? idade >= 18 endendusuario = Usuario.new('lailson')usuario.idade = 22puts usuario.maior?

CLASSES

class Admin < Usuario def admin? true endendadmin = Admin.new('Lailson')puts admin.nome

HERANÇA

module Autenticacao class Usuario # ... end class Admin < Usuario # ... endendadmin = Autenticacao::Admin.new

MÓDULOS

n = [1,2,3,4]puts n.sum => NoMethodError

CLASSES ABERTAS

class Array def sum self.reduce(&:+) endendn = [1,2,3,4]puts n.sum

CLASSES ABERTAS

> gem install prawnrequire 'prawn'Prawn::Document.generate('hello.pdf') do |pdf| pdf.text("Hello Prawn!") end

RUBY GEMS

> gem list> gem list rails> gem uninstall rails

RUBY GEMS

IMPLEMENTAÇÕES

REFERÊNCIAS

THE RUBY PROGRAMMING LANGUAGEDavid Flanagan e Matz“The Hummingbird Book”

REFERÊNCIAS

PROGRAMMING RUBY 1.9Dave Thomas“The Pickaxe Book”

REFERÊNCIAS

THE RUBY WAYHal Fulton

REFERÊNCIAS

RUBY DOCruby-doc.org

REFERÊNCIAS

RAILS APIrailsapi.com

RAILSNA PRATICA

RAILS2004

US, 37signals

David DHH

3.0.5 – 2.3.11

QUEM USA

SLIDESHARE

YELLOW PAGES

TWITTER SCRIBDHULU

CRUNCH BASE

JUSTIN TV

PITCHFORK MEDIA

GENI

BASECAMP

BLOG BLOGS

GOV. BRASILEIRO*

BE ON THE NET*

ONDE TRABALHAR*

CONFERÊNCIAS

RAILSCONFOXENTE RAILS*

EURUKORUBYCONF

RUBYCONF LATIN AMERICA*

RS ON RAILS*

CONFERENCIA RAILS

GORUCO

EMPRESAS

HASHROCKET

37SIGNALS

THOUGHTWORKS*

PLATAFORMATEC*THOUGHTBOT

ENGINE YARD

GONOW*

TINK*GUAVA*

CAELUM*

SOFTA*

GURUS

GURU-RS

FREVO ON RAILS

CEARÁ ON RAILS

RAILSPI

GURU-SP

RAILSMG

PRINCÍPIOS

DON’T REPEAT YOURSELFDRY

PRINCÍPIOS

CONVENTION OVER CONFIGURATIONCoC

PRINCÍPIOS

KEEP IT STUPIDLY SIMPLEKISS

PRINCÍPIOS

YOU AIN’T GONNA NEED ITYAGNINOT INVENTED HERE SYNDROMENIHSTEST ALL THE FUCKING TIMETATFT

RAILTIES

ACTIVESUPPORT

ACTIVEMODEL

ACTIVERECORD

ACTIONPACK

ACTIONMAILER

ACTIVERESOURCE

FRAM

EWOR

K DE F

RAME

WORK

S

ARQUITETURA

MVCMODEL-VIEW-CONTROLLER

ARQUITETURAVIEW

HTML, CSS, JS,Flash, PDF

CONTROLLERURLs, RotasAções

MODELRegras de negócioBanco de dados

> rails new taverna create create README create Rakefile create config.ru create .gitignore create Gemfile create app create app/controllers/appli...

CRIANDO APP

ESTRUTURA

> ls -l taverna -rw-r--r-- 1 foo bar 743 Mar 25 15:39 Gemfile -rw-r--r-- 1 foo bar 9126 Mar 25 15:39 README -rw-r--r-- 1 foo bar 267 Mar 25 15:39 Rakefile drwxr-xr-x 7 foo bar 238 Mar 25 15:39 app drwxr-xr-x 10 foo bar 340 Mar 25 15:39 config -rw-r--r-- 1 foo bar 157 Mar 25 15:39 config.ru drwxr-xr-x 3 foo bar 102 Mar 25 15:39 db drwxr-xr-x 3 foo bar 102 Mar 25 15:39 doc drwxr-xr-x 3 foo bar 102 Mar 25 15:39 lib drwxr-xr-x 6 foo bar 204 Mar 25 15:39 log drwxr-xr-x 11 foo bar 374 Mar 25 15:39 public drwxr-xr-x 3 foo bar 102 Mar 25 15:39 script drwxr-xr-x 8 foo bar 272 Mar 25 15:39 test drwxr-xr-x 6 foo bar 204 Mar 25 15:39 tmp drwxr-xr-x 3 foo bar 102 Mar 25 15:39 vendor

RESOLVENDO DEPENDÊNCIAS

> bundle Using rake (0.8.7) Using abstract (1.0.0) Using activesupport (3.0.4) Using builder (2.1.2) Using i18n (0.5.0) Using activemodel (3.0.4) Using erubis (2.6.6) Installing rack (1.2.2)...

PRIMEIRO CADASTRO

> rails generate scaffold mesa codigo:string maximo_pessoas:integer invoke active_record create db/migrate/20110324004301_create_mesas.rb create app/models/mesa.rb invoke test_unit create test/unit/mesa_test.rb create test/fixtures/mesas.yml ...

> rake db:create> rake db:migrate == CreateMesas: migrating ==================================== -- create_table(:mesas) -> 0.0019s == CreateMesas: migrated (0.0023s) ===========================

CRIANDO O BANCO

> rails server => Booting WEBrick => Rails 3.0.5 application starting in development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server

INICIANDO O SERVIDOR

> rails generate model atendimento invoke active_record create db/migrate/20110325145014_create_aten... create app/models/atendimento.rb invoke test_unit create test/unit/atendimento_test.rb create test/fixtures/atendimentos.yml

GERANDO MODELOS

> rails generate controller atendimentoscreate app/controllers/atendimentos_controller.rbinvoke erbcreate app/views/atendimentos

GERANDO CONTROLADORES

> rails generate model pedido atendimento:references descricao:text valor:decimal invoke active_record create db/migrate/20110325145215_create_pedi... create app/models/pedido.rb invoke test_unit create test/unit/pedido_test.rb create test/fixtures/pedidos.yml

GERANDO PEDIDOS

> rails generate controller pedidos create app/controllers/pedidos_controller.rb invoke erb create app/views/pedidos invoke test_unit create test/functional/pedidos_controller_t... invoke helper create app/helpers/pedidos_helper.rb invoke test_unit create test/unit/helpers/pedidos_helper_t...

GERANDO PEDIDOS

ALTERNATIVA

SINATRAsinatrarb.com

REFERÊNCIAS

AGILE WEB DEVELOPMENT WITH RAILSSam Ruby

REFERÊNCIAS

DESENVOLVIMENTO ÁGIL PARA WEB 2.0Caelum

REFERÊNCIAS

RAILSGUIDESguides.rubyonrails.org

REFERÊNCIAS

AKITAON RAILSakitaonrails.com

REFERÊNCIAS

RAILSCASTSrailscasts.com

REFERÊNCIAS

PEEPCODEpeepcode.com

MAIS UMA COISA…

!rev"nrails.com.br