Workshop Ruby on Rails dia 1 ruby-pt

84
Workshop Ruby on Rails Dia 1

description

Dia 1 do workshop sobre Ruby on Rails de 2 dias.Este dia foi mais dedicado ao Ruby.

Transcript of Workshop Ruby on Rails dia 1 ruby-pt

Page 1: Workshop Ruby on Rails dia 1 ruby-pt

Workshop Ruby on Rails

Dia 1

Page 2: Workshop Ruby on Rails dia 1 ruby-pt

Web development that doesn’t hurt

Ruby on Rails is an open-source web framework that’s optimized for programmer happiness and

sustainable productivity. It lets you write beautiful code by favoring convention over

configuration.

Page 3: Workshop Ruby on Rails dia 1 ruby-pt

Agenda 1º Dia

Apresentação

A Linguagem de programação Ruby

Introdução ao Ruby on Rails

Page 4: Workshop Ruby on Rails dia 1 ruby-pt

Agenda 2º Dia

Ruby On Rails all the Way

Live coding de uma aplicação web em Rails

Page 5: Workshop Ruby on Rails dia 1 ruby-pt

“Ruby on Rails is astounding. Using it is like watching a kung-fu movie, where a dozen bad-ass frameworks prepare to beat up the little newcomer

only to be handed their asses in a variety of imaginative ways.”

Nathan Torkington, O'Reilly Program Chair for OSCON

Page 6: Workshop Ruby on Rails dia 1 ruby-pt

• Jason Fried + David Heinemeier Hanson =>BaseCamp, Ruby on Rails• Java, PHP => Ruby• Best Hacker of the year 2005, Jolt Awards• Getting Real - Less is More• Dave Thomas and the Pragmatic Programmers• Agile Manifesto

Rails background

Page 7: Workshop Ruby on Rails dia 1 ruby-pt

A linguagem de programação

Ruby

Page 8: Workshop Ruby on Rails dia 1 ruby-pt

“I always thought Smalltalk would beat Java. I just didn’t know it would be called ‘Ruby’ when it did”

- Kent Beck

Mudança de Paradigma

Page 9: Workshop Ruby on Rails dia 1 ruby-pt

•Criado em 1993 por Yukihiro Matsumoto, aka (Matz)•Linguagem Dinâmica, totalmente orientada a objectos.•Herança de Smalltalk, Lisp, Phyton, Perl, Eiffel, Ada.

RUBY

The image cannot be displayed. Your computer may not have enough memory to open the image, or the image may have been corrupted. Restart your computer, and then open the file again. If the red x still appears, you may have to delete the image and then insert it again.

Page 10: Workshop Ruby on Rails dia 1 ruby-pt

• Genérica, interpretada, reflexiva , com garbage collection.• Optimizada para os programadores e não para os compiladores.• Mais poderosa do que o Perl, mais orientada a objectos do que o Python• Tudo são objectos.Não existem tipos primitivos• Tipagem Dinamica Forte.

O Ruby

Page 11: Workshop Ruby on Rails dia 1 ruby-pt

•Linguagem natural e coerente•Princípio da menor supresa•Muito productiva: menos linhas de código•Comunidade muito activa

Ruby

Page 12: Workshop Ruby on Rails dia 1 ruby-pt

•Tipagem dinámica (vs. estática)• Suporte completo para introspecção – (respond_to)• Redefinição de métodos• Method_missing• Criação de DSL – domain specific language

O Ruby é Altamente dinamico

Page 13: Workshop Ruby on Rails dia 1 ruby-pt

Focus na produtividade do

programador

Page 14: Workshop Ruby on Rails dia 1 ruby-pt

Rubyist do it with class !

Page 15: Workshop Ruby on Rails dia 1 ruby-pt

Definir uma classe e instanciar um objecto

class Consultordef initialize(nome)

# As váriaveis de instancia começam com @@nome = nome

end

def diz_ola # Método de instanciaputs "#{@nome} diz olá”

end

end

tiago = Consultor.new(“Tiago”)tiago.diz_ola

Page 16: Workshop Ruby on Rails dia 1 ruby-pt

Herança de Classes# Programador é um Consultor e extende a classe com carct. adicionaisclass Programador < Consultor def initialize(nome, ide_favorito)

super(nome) @ide_favorito = ide_favorito

end # redefinimos o método diz_ola no Consultor def diz_ola

superputs "O IDE favorito é #{@ide_favorito}”

endend

paulo = Programador.new(“Paulo”, “TextMate”)paulo.diz_ola

Page 17: Workshop Ruby on Rails dia 1 ruby-pt

Métodos Getter- e Setterclass Consultor def initialize(nome)

self.nome = nome end

def nome@nome

end

def nome=(nome)@nome = nome

endend

consultor = Consultor.new("Pedro")puts consultor.nomeconsultor.nome = "David"puts consultor.nome

Page 18: Workshop Ruby on Rails dia 1 ruby-pt

attr_accessor

class Consultor attr_accessor :nome def initialize(nome)

self.nome = nomeend

end

consultor = Consultor.new("Paulo")puts consultor.nomeconsultor.nome = "David"puts consultor.nome

Page 19: Workshop Ruby on Rails dia 1 ruby-pt

attr_writer class Consultorattr_writer :pago

def initialize

@pago = falseend

def pago?@pago

end

def recebe_pagamento... codigo que executa o pagamento...pago = true # Indicate payment is done

endend

consultor = Consultor.newconsultor.recebe_pagamentoputs consultor.pago?

Page 20: Workshop Ruby on Rails dia 1 ruby-pt

Métodos

•Quando se invoca um método os parêntesis nos argumentos são opcionais.•Os Métodos têm sempre um receptor. O receptor implícito é self.•Os métodos são identificados pelos seus nomes apenas, não existe overloading com assinaturas de argumentos•Existem métodos de classe e métodos de instância.•Os métodos podem ser públicos, protegidos ou privados.•A última expressão que é avaliada num método é o valor de retorno.•Os argumentos podem ter valores por defeito ex:def meu_metodo(a, b = {:consultor=>’senior’})

Page 21: Workshop Ruby on Rails dia 1 ruby-pt

Convenções

• MinhaClasse• method_name, dangerous_method!, question_method?, setter_method=• MINHA_CONSTANTE = 3.14• variavel_local = 3.14• @variavel_instancia• @@variavel_classe• $variavel_global

Page 22: Workshop Ruby on Rails dia 1 ruby-pt

Expressões Booleanas

• Todos os objectos devolvem verdade excepto false e nil• false e true são as únicas instancias da FalseClass and TrueClass• As expressões booleanas devolvem o último objecto avaliado.• a and b or c <=> (a and b) or c• a = b and c <=> (a = b) and c• a = b && c <=> a = (b && c)• puts a if a = b # Using assignments in boolean expressions• a = true; b = false; a and b and c() # => c() não é invocado

Page 23: Workshop Ruby on Rails dia 1 ruby-pt

Atribuições

• a, b = b, a # trocar os valores• a = 1; b = 1• a = b = 1• a += 1 # a = a + 1• a, b = [1, 2]• a = b || c• a ||= b

Page 24: Workshop Ruby on Rails dia 1 ruby-pt

Idiomatic Ruby# Extra verboso:user_id = nil

if commentsif comments.first

if comments.first.useruser_id = comments.first.user.id

endend

end

# Idiomatico:user_id = comments && comments.first &&comments.first.user && comments.first.user.id

Page 25: Workshop Ruby on Rails dia 1 ruby-pt

Módulos# Mixins - em vez de herança múltipla

module NomeCompletodef nome_completo

"#{primeiro_nome} #{ultimo_nome}"end

end

class Consultorinclude NomeCompleto

end

Consultor.new("John", "Travolta").nome_completo

Page 26: Workshop Ruby on Rails dia 1 ruby-pt

Módulos# Namespaces - para evitar colisões de nomesmodule MinhaApp class Consultor

attr_accessor :name

def initialize(name)self.name = name

end endend

MinhaApp::Consultor.new("John Travolta")

Page 27: Workshop Ruby on Rails dia 1 ruby-pt

Modules vs Classes

• Os Módulos modelam características ou propriedades de entidades ou coisas. Os Módulos não podem ser instanciados.•Os nomes dos Módulos têm tendencia para serem adjectivos (Comparable, Enumerable etc.). •Uma class pode “mix in” vários módulos.•As classes modelam entidades ou coisas.•Os nomes das classes têm tendencia para serem substantivos, coisas.•Uma classe somente pode ter uma super-classe.

Page 28: Workshop Ruby on Rails dia 1 ruby-pt

Tudo é um objecto

• 2 + 2 é equivalente a 2+(2) e 2.send(:+, 2)• 2.hours.ago• 2.class # => Fixnum• 2.class.methods - Object.methods• “workshop rails”.capitalize

Page 29: Workshop Ruby on Rails dia 1 ruby-pt

Constantes

•As constantes definidas numa class/module estão disponiveis dentro dessa class/module e fora da classe com o operador scope ::• As constantes definidas fora da class/module podem ser acedidas de todo o lado.•As constantes não podem ser definidas nos métodos

Page 30: Workshop Ruby on Rails dia 1 ruby-pt

Introspection

•andreas = Consultor.new(“Andreas”)•andreas.inspect•andreas.class # => Consultor•andreas.class.superclass # => Object•andreas.class.superclass.superclass # => nil•andreas.ancestors # lists Modules•Consultor.instance_methods(false)•puts Kernel.methods.join(“\n”)

Page 31: Workshop Ruby on Rails dia 1 ruby-pt

Aritmética e Conversões2.class == Fixnum

Fixnum.superclass == Integer

Integer.superclass == Numeric

3.0.class == Float

Float.superclass == Numeric

2/3 == 0 ; 2/3.0 # => 0.6666667 ; 2 + 3.0 == 5.0 ;

“2”.to_i + “3.0”.to_f == 5.0

10000000000.class == Bignum ; Bignum.superclass == Integer

2 + “3” # => TypeError: String can’t be coerced into

Page 32: Workshop Ruby on Rails dia 1 ruby-pt

String class• “ruby”.upcase + “ “ + “rails”.capitalize

• “time is: #{Time.now}\n second line”

• ‘no interpolation “here” #{Time.now}’

• “I“ << “Go” << “Ruby”

• %Q(“C” och “Java”} # “\”C\” och \”Java\””

• %q{single ‘quoted’} # ‘single \’quoted\’’

• <<-END

A here

document at #{Time.now}

END

Page 33: Workshop Ruby on Rails dia 1 ruby-pt

array classa = [“Ruby”, 99, 3.14] ; a[1] == 99 ; a << “Rails”

[‘C’, ‘Java’, ‘Ruby’] == %w{C Java Ruby}

[1, 2, 3].map { |x| x**2 }.join(“, “)

[1, 2, 3].select { |x| x % 2 == 0 }

[1, 2, 3].reject { |x| x < 3 }

[1, 2, 3].inject { |sum, i| sum + i }

[1, [2, 3]].flatten! # => [1, 2, 3]

raise “Invalid language” if ! %w {C Java Ruby}.include?(language)

fruits = [‘apple’, ‘banana’]

fruits += [‘apple’] unless fruits.include?(‘apple’)

fruits |= [‘apple’]

Page 34: Workshop Ruby on Rails dia 1 ruby-pt

hash class

h = {:lang => ‘Ruby’, :framework => ‘Rails’}

h[:lang] == ‘Ruby’

h[:perl] == nil

ENV = {“USER” => “peter”, “SHELL” => “/bin/bash”}

ENV.each {|k, v| puts “#{k}=#{v}” }

Page 35: Workshop Ruby on Rails dia 1 ruby-pt

Symbols

# Os Symbols començam com :

:action.class == Symbol

:action.to_s == “action”

:action == “action”.to_sym

# Existe apenas uma instancia de cada simbolo

:action.equal?(:action) # => true

‘action’.equal?(‘action’) # => false

# tipicamente são utilizados como chaves nas tabelas de Hash

link_to “Home”, :controller => “home”

Page 36: Workshop Ruby on Rails dia 1 ruby-pt

Mais sobre os métodos

• Um número arbitrário de argumentos: def my_methods(*args)

• Converter um Array para argumentos: my_method([a, b]*)

• Invocação dinámica de um método: object.send(:method_name)

• Duck typing: object.respond_to?(:nome_metodo)

• Se o último argumento é uma Hash table, as chavetas podem ser omitidas: link_to “Home”, :controller => ‘home’

Page 37: Workshop Ruby on Rails dia 1 ruby-pt

if, unless e o operador ?

message = if count > 10 “Try again”

elsif tries == 3

“You lose”

else

“Enter command”

end

raise “Unauthorized” if !current_user.admin?

raise “Unauthorized” unless current_user.admin?

status = input > 10 ? “Number too big” : “ok”

Page 38: Workshop Ruby on Rails dia 1 ruby-pt

Iterators: while, until, and forwhile count < 100

puts count count += 1end

pagamento.make_request while (pagamento.failure? and pagamento.tentativas < 3)

for user in @users next if user.admin? if user.pago? puts user break endend

until count > 5 puts count count += 1end

# Statement modifier version of untilputs(count += 1) until count > 5

Page 39: Workshop Ruby on Rails dia 1 ruby-pt

casecase x

when 0when 1, 2..5

puts "Second branch"when 6..10

puts "Third branch"when *[11, 12]

puts “Fourth branch”when String: puts “Fifth branch”when /\d+\.\d+/

puts “Sixth branch”when x.downcase == “peter”

puts “Seventh branch”else

puts "Eight branch"end

Page 40: Workshop Ruby on Rails dia 1 ruby-pt

Blocos, fechos, e objectosproc

def invoke_blockputs "before block"yield 5puts "after block"

endname = "Ruby"invoke_block { |n| puts "In block with #{name}, received #{n}"}my_proc = Proc.new { |n| puts "In proc, received #{n}"}my_proc.call 2invoke_block &my_proc

Page 41: Workshop Ruby on Rails dia 1 ruby-pt

Exemplos de utilização de Blocos# Iteração

[1, 2, 3].each {|item| puts item }

# Utilizar Recursosfile_contents = open(file_name) { |f| f.read }

# Callbackswidget.on_button_press do

puts “Got button press”end

# Convençaõ: blocos só de uma linha utilizam {...} e os blocos multilinha usam do ... end

Page 42: Workshop Ruby on Rails dia 1 ruby-pt

operações frequentes em strings

•“ “.blank? == true•my_string.each_with_index { |line, i| puts “#{i}: #{line}” }•“abc”.scan(/./).each { |char| puts char }•“we split words”.split.join(“, “)•“ strip space “.strip•sprintf(“value of %s is %.2f”, “PI”, 3.1416)•“I Go Ruby”[2, 2] == “I Go Ruby”[2..3] == “Go”

Page 43: Workshop Ruby on Rails dia 1 ruby-pt

Uff... ainda não acabou ?

Para uma próxima oportunidade:- Expressões regulares- Exceptions- Reabertura de classes e monkey patching

Metaprogramação com:- method_missing, const_missing, eval, binding, instance_eval class_eval / module_eval

Page 44: Workshop Ruby on Rails dia 1 ruby-pt

Instalação do Ruby

Page 45: Workshop Ruby on Rails dia 1 ruby-pt

Instalação

Pré-instalado em MAC

Em Windows: One-Click-Installer:

http://rubyforge.org/frs/?group_id=167

Em Linux:

http://www.ruby-lang.org/en/downloads/

Page 46: Workshop Ruby on Rails dia 1 ruby-pt

Introdução à consola IRB

Page 47: Workshop Ruby on Rails dia 1 ruby-pt

IRB

consola interactiva de Ruby

basta escrever irb na shell

Page 48: Workshop Ruby on Rails dia 1 ruby-pt

Futuro do Ruby

Page 49: Workshop Ruby on Rails dia 1 ruby-pt

Futuro do Ruby

• versão 1.9.1

• outras inovações previstas

Page 50: Workshop Ruby on Rails dia 1 ruby-pt

Introdução ao Ruby on Rails

Page 51: Workshop Ruby on Rails dia 1 ruby-pt

Framework open-source para construção de aplicações web

utilizando a linguagem de programação Ruby.

Page 52: Workshop Ruby on Rails dia 1 ruby-pt
Page 53: Workshop Ruby on Rails dia 1 ruby-pt
Page 54: Workshop Ruby on Rails dia 1 ruby-pt
Page 55: Workshop Ruby on Rails dia 1 ruby-pt
Page 56: Workshop Ruby on Rails dia 1 ruby-pt
Page 57: Workshop Ruby on Rails dia 1 ruby-pt
Page 58: Workshop Ruby on Rails dia 1 ruby-pt

PessoasTempo

DistanciaFuso Horário

Limitações

Page 59: Workshop Ruby on Rails dia 1 ruby-pt
Page 60: Workshop Ruby on Rails dia 1 ruby-pt

REAL

baseado em necessidades reais

DRY

elimina tarefas repetitivas

COC

adopta convenções

ÁGIL

aberto a mudanças no desenvolvimento

Page 61: Workshop Ruby on Rails dia 1 ruby-pt

PríncipiosDRY: Don’t Repeat Yourself

Cada coisa no seu sítio

Reduzir a quantidade de código reduz erros

COC: Convenção sobre Configuração

Torna as aplicações mais fáceis de entender

Menos trabalho de desenvolvimento

Só precisamos de configurar situações extra-

Page 62: Workshop Ruby on Rails dia 1 ruby-pt

• Desenhado para a “felicidade” do programador

• Felicidade + Motivação = produtividade

• Ambiente de testes incluído

• Flexibilidade perante as mudanças

• Velocidade de desenvolvimento (agilidade)

• Beleza do código

Page 63: Workshop Ruby on Rails dia 1 ruby-pt
Page 64: Workshop Ruby on Rails dia 1 ruby-pt

VídeoBlog em 15 Minutos

http://rubyonrails.org/screencasts

Page 65: Workshop Ruby on Rails dia 1 ruby-pt

Bons exemplos de aplicações

Page 66: Workshop Ruby on Rails dia 1 ruby-pt

• Basecamp• Twitter • GetSatisfaction• RevolutionHealth• Scribd• Hulu• HighRise• Shopify• La Coctelera

Lá fora

Page 67: Workshop Ruby on Rails dia 1 ruby-pt
Page 68: Workshop Ruby on Rails dia 1 ruby-pt
Page 69: Workshop Ruby on Rails dia 1 ruby-pt
Page 70: Workshop Ruby on Rails dia 1 ruby-pt
Page 71: Workshop Ruby on Rails dia 1 ruby-pt
Page 72: Workshop Ruby on Rails dia 1 ruby-pt
Page 73: Workshop Ruby on Rails dia 1 ruby-pt
Page 74: Workshop Ruby on Rails dia 1 ruby-pt
Page 75: Workshop Ruby on Rails dia 1 ruby-pt
Page 76: Workshop Ruby on Rails dia 1 ruby-pt

• Book Worms

• Goplan

• InfoFranchising

• Casa Certificada

• Alta de Lisboa

• Adega Mayor

Cá dentro

Page 77: Workshop Ruby on Rails dia 1 ruby-pt
Page 78: Workshop Ruby on Rails dia 1 ruby-pt
Page 79: Workshop Ruby on Rails dia 1 ruby-pt
Page 80: Workshop Ruby on Rails dia 1 ruby-pt
Page 81: Workshop Ruby on Rails dia 1 ruby-pt
Page 82: Workshop Ruby on Rails dia 1 ruby-pt
Page 83: Workshop Ruby on Rails dia 1 ruby-pt

Perguntas ?