Conhecendo 
Ruby 
& 
Rails
Quem sou eu: 
Sérgio Henrique Miranda Júnior 
Líder Técnico @ Dito Internet 
Bacharel em Ciência da Computação pela 
Universidade FUMEC
Dito Internet: 
Analytics + Ativação + Social 
Através da combinação dessas 3 forças 
a Dito atua com seus clientes com o objetivo 
de engajar o seu público alvo e maximizar os resultados
Alguns números… 
Mais de 27.631.682 eventos monitorados 
Uma média de 4K Requisições Por Minuto (RPM)
Alguns clientes…
Ruby http://www.ruby-lang.org/pt/
“ uma linguagem dinâmica 
e open source com foco na 
simplicidade e produtividade ” 
https://www.ruby-lang.org/en/
Um pouco de história: 
A linguagem foi lançada em 1995 
Desenvolvida por um japonês: Yukihiro “ Matz ” Matsumoto 
Popularizada em 2006 graças ao Ruby on Rails 
Influência de Perl, Smalltalk, Eiffel, Ada e Lisp
Tudo é objeto: 
>> 1500.class 
=> Fixnum 
>> 1333.even? 
=> false 
>> “UFLA”.length 
=> 4
Variáveis: 
Tipagem dinâmica 
Não precisam ser declaradas 
Variáveis globais começam com o símbolo $ 
Variáveis de instância começam com símbolo @ 
Variáveis de classe começam com o símbolo @@ 
Variáveis locais começam com a letra minúscula
Variáveis: 
>> $diretorio = ‘/var' 
>> faculdade = "UFLA" 
>> class Pessoa! 
>> @@quantidade = nil! 
>> def nome! 
>> @nome! 
>> end! 
>> end
Variáveis: 
Como faz para validar tipo de variáveis ? 
Duck typing! 
Se anda como um pato… 
faz “quack” como um pato… 
provavelmente é um pato!
Símbolos: 
>> name = twitter_api[:screen_name] 
Basicamente é uma string interna 
Existe somente uma cópia de cada símbolo na memória 
Persistem na memória até o programa ser finalizado
Blocos: 
elementos = [1,2,3,4] 
elementos.each do |elemento| 
faca_algo(elemento) 
end 
Um bloco de código está sendo passado para o método 
each. O bloco será executado para cada elemento do array 
def each 
index = 0 
while index < self.length do 
yield self[index] 
index += 1 
end 
end
Blocos: 
É uma feature muito importante da linguagem. 
Vários métodos das bibliotecas padrões utilizam blocos 
em suas implementações 
File.open("path_to_file") do |arquivo| 
faca_algo_com(arquivo) 
end 
seu arquivo é fechado automaticamente!
Métodos: 
Definição é realizada pela keyworkd def 
Ruby suporta valor default e número variável de argumentos 
def metodo_qualquer(arg1, arg2 = "teste") 
puts arg1 
puts arg2 
end 
metodo_qualquer(1) ! 
#imprime na saida padrão: 1n “teste” 
metodo_qualquer(0, “UFLA”) ! 
#imprime na saida padrão: 0n “UFLA”
Métodos: 
def add(*numeros) 
numeros.inject(0) do 
|soma, numero| soma + numero 
end 
end 
! 
add(1) 
add(1, 2) 
add(1, 2, 3) 
add(1, 2, 3, 4)
Classes: 
Definição é realizada pela keyword class e o construtor é 
o método initialize 
class Professor 
def initialize(nome) 
@nome = nome 
end 
! 
def nome 
@nome 
end 
end 
! 
p = Professor.new("Ricardo") 
p.nome
Classes: 
Classes em Ruby nunca são fechadas. Você pode alterar a classe 
que desejar em runtime! 
class Fixnum 
def +(another_integer) 
self * another_integer 
end 
end 
>> 5 + 2 # mesma coisa que -> 5.+(2) 
=> 10 #oooopssss! with great power comes great 
responsibility!
Classes: 
Herança é expressada de uma maneira bem simples 
class Professor < Profissional 
def metodo_sobrescrito(nome) 
# super sem nenhum argumento 
# irá passar todos os argumentos 
# recebidos para o método 
# da classe pai 
resultado = super 
resultado 
end 
end
Módulos: 
Agrupam métodos, constantes e variáveis de classe 
Não podem ser instanciados ou utilizados como subclasse 
module QualquerCoisa 
def self.algum_metodo 
... 
end 
! 
end 
! 
QualquerCoisa.algum_metodo
Módulos: 
Podem ser incluídos em classes 
class Carro 
include MotorV8 
include ABS 
include AirBag 
! 
def acelerar 
#... 
end 
end
Gem: 
É o gerenciador de pacotes utilizado pela linguagem 
Pode conter uma aplicação completa! 
$ gem install devise! 
$ gem install mysql2! 
$ gem install archruby
Ecossistema: 
Garbage Collector 
Standard Library 
String encoding/transcoding 
Regexp engine 
Utilitários (ferramentas de debug, formatação de strings) 
Parser 
VM
Recapitulando: 
definição de método 
class Professor 
def initialize(nome) 
if nome.eql? "" 
@nome = "Fulano" 
else 
condicional 
@nome = nome 
end 
end 
! 
def nome 
@nome 
end 
end 
! 
p = Professor.new("Ricardo") 
p.nome 
definição de classe 
variável de instância 
Constante 
chamada de 
método
Rails http://rubyonrails.com.br/
“ é um framework web open source 
otimizado para a felicidade e produtividade 
do programador. Faz com que você escreva 
código bonito favorecendo a convenção 
sobre configuração ” 
http://rubyonrails.org/
Framework: 
“ Conjunto de componentes de software 
que provêem uma arquitetura e estrutura 
básicas para o desenvolvimento de uma 
aplicação. É uma aplicação semi pronta que 
deve ser extendida e personalizada ”
Filosofia do Rails: 
Don’t repeat yourself (DRY): é uma sugestão para não repetir o 
mesmo código em vários lugares 
Convention over Configuration: o Rails faz suposições sobre o 
que você quer fazer e como você fará o que deseja 
Representational State Transfer (REST): é uma maneira de 
organizar sua aplicação em recursos e verbos padrões utilizados 
pelo protocolo HTTP
Model View Controller (MVC): 
apresenta uma visão do 
model para o usuário 
View 
apresenta 
seleciona & renderiza 
utiliza, procura e controla 
Controller Model 
lógica do negócio, 
lógica do domínio 
controla a interação 
entre o usuário e o app
Sub-componentes do Rails: 
Action Mailer: é um framework para desenvolver serviços de 
entrega de emails 
Action Pack: é um framework para responder e receber 
requisições web. Fornece mecanismos para rotas e definições 
de controllers que implementam ações e renderizam o 
resultado gerado 
Active Model: fornece várias interfaces que podem ser 
utilizadas pelo model
Sub-componentes do Rails: 
Active Record: Conecta classes a tabelas do banco de dados, 
ou seja, é o ORM do Rails. 
Active Support: é uma coleção de classes utilitárias e 
extensões a standard library, que são úteis ao Rails 
Action View: é um framework para procurar e renderizar 
templates.
Model View Controller (MVC): 
Action View 
apresenta 
seleciona & renderiza 
Action Controller utiliza, procura e controla 
Active Record 
(& Action Dispatch) (& Active Model)
Exemplo ActiveRecord: 
class Person < ActiveRecord::Base 
validates :email, :presence => true 
validates :surname, :presence => true, :if => "name.nil?" 
! 
has_many :books 
end 
! 
class Book < ActiveRecord::Base 
validates :name, :presence => true 
! 
belongs_to :person 
end 
! 
!p = Person.new(:email => nil, :name => nil, :surname => "Miranda") 
p.valid? # false 
puts p.errors # email can't be blank 
! 
p1 = Person.first 
p1_books = p1.books
Ambientes: 
Teste: é o ambiente que sua aplicação é executada quando seus 
testes automatizados estão sendo realizados 
Desenvolvimento: é o ambiente default quando você está 
trabalhando na sua aplicação 
Produção: é o ambiente em que sua aplicação é executada 
quando ela está no ar, sendo utilizada por usuários reais
Desenvolvimento com testes: 
Os testes são feitos antes da implementação 
O Rails já vem preparado para o desenvolvimento orientado 
a testes 
Framework largamente utilizado para testes na comunidade 
Rails: Rspec
Desenvolvimento com testes: 
describe Teacher do 
describe "requirements" do 
it "should have a name" do 
t = Teacher.new(:name => nil) 
t.should_not be_valid 
end 
end 
end
Desenvolvimento com testes: 
Análise Teste Implemente 
Teste Refatore Teste
Migrations: 
É uma forma eficiente de alterar a base de dados 
Mantém o controle das alterações feitas e garante uma 
estrutura de base idêntica entre os desenvolvedores 
Facilita modificações na base de produção
Migrations: 
class CreateTeacher < ActiveRecord::Migration 
def change 
create_table :teachers do |t| 
t.string :name 
t.string :cpf 
t.timestamps 
end 
end 
end
Assets pipeline: 
É um framework para concatenar e reduzir ou comprimir 
arquivos JavaScript e CSS. 
Adiciona a possibilidade de escrever os assets em outras 
linguagens e pre-processadores como: CoffeeScript, Sass e 
ERB
Assets pipeline:
Assets pipeline:
Rake: 
É um software para gerenciar tarefas. Similar ao make 
As tarefas são colocadas em Rakefile, que contêm código Ruby 
Migrations e testes automatizados são exemplos de tarefas 
executadas com o Rake
Rake: 
namespace :namespace_da_sua_task do 
desc "descricao da sua task" 
task :nome_da_sua_task => :dependencia_da_sua_task do 
tarefa_a_ser_executada 
end 
end
Scaffold: 
É um gerador de código que proporciona um desenvolvimento 
mais rápido 
$ rails generate scaffold Post nome:string titulo:string 
conteudo:string
Console: 
É um Read Eval Print Loop (REPL) utilizado para interagir com 
a sua aplicação Rails sem precisar utilizar a interface web 
para isso 
$ rails c 
>> Post.all 
>> Post.first 
>> p = Post.new(! 
:nome => “Teste”, ! 
:titulo => “titulo teste”, ! 
:conteudo => “Conteudo do post”)
Hello Rails: 
$ rails new hello_rails 
$ cd hello_rails 
$ rails generate controller home index 
$ vim app/views/home/index.html.erb => <h1> Hello Rails! </h1> 
$ vim config/routes.rb => root :to => “home#index” 
$ rails server 
Abra seu browser e acesse o endereço http://localhost:3000
Hello Rails:
Recapitulando: 
MVC 
Componentes 
Ambientes 
Testes 
Migrations 
Assets pipeline 
Rake 
Scaffold
Quem utiliza Rails:
NÃO vire REFÉM 
do Framework 
escolha a ferramenta certa para o 
problema que você está enfrentando
Software só tem 
valor quando está 
sendo utilizado
O que vocês precisam… 
Terminal para executar seus comandos e inicializar 
o rails server 
Editor de texto para escrever/editar códigos 
Browser para visualizar e interagir com a sua aplicação 
Ruby, para programar sua aplicação 
Rails, o framework para desenvolver aplicações web
OBRIGADO! 
twitter: @sergiohenrique 
sergiohenriquemiranda.com.br

Ruby & Rails

  • 1.
  • 2.
    Quem sou eu: Sérgio Henrique Miranda Júnior Líder Técnico @ Dito Internet Bacharel em Ciência da Computação pela Universidade FUMEC
  • 3.
    Dito Internet: Analytics+ Ativação + Social Através da combinação dessas 3 forças a Dito atua com seus clientes com o objetivo de engajar o seu público alvo e maximizar os resultados
  • 4.
    Alguns números… Maisde 27.631.682 eventos monitorados Uma média de 4K Requisições Por Minuto (RPM)
  • 5.
  • 6.
  • 7.
    “ uma linguagemdinâmica e open source com foco na simplicidade e produtividade ” https://www.ruby-lang.org/en/
  • 8.
    Um pouco dehistória: A linguagem foi lançada em 1995 Desenvolvida por um japonês: Yukihiro “ Matz ” Matsumoto Popularizada em 2006 graças ao Ruby on Rails Influência de Perl, Smalltalk, Eiffel, Ada e Lisp
  • 9.
    Tudo é objeto: >> 1500.class => Fixnum >> 1333.even? => false >> “UFLA”.length => 4
  • 10.
    Variáveis: Tipagem dinâmica Não precisam ser declaradas Variáveis globais começam com o símbolo $ Variáveis de instância começam com símbolo @ Variáveis de classe começam com o símbolo @@ Variáveis locais começam com a letra minúscula
  • 11.
    Variáveis: >> $diretorio= ‘/var' >> faculdade = "UFLA" >> class Pessoa! >> @@quantidade = nil! >> def nome! >> @nome! >> end! >> end
  • 12.
    Variáveis: Como fazpara validar tipo de variáveis ? Duck typing! Se anda como um pato… faz “quack” como um pato… provavelmente é um pato!
  • 13.
    Símbolos: >> name= twitter_api[:screen_name] Basicamente é uma string interna Existe somente uma cópia de cada símbolo na memória Persistem na memória até o programa ser finalizado
  • 14.
    Blocos: elementos =[1,2,3,4] elementos.each do |elemento| faca_algo(elemento) end Um bloco de código está sendo passado para o método each. O bloco será executado para cada elemento do array def each index = 0 while index < self.length do yield self[index] index += 1 end end
  • 15.
    Blocos: É umafeature muito importante da linguagem. Vários métodos das bibliotecas padrões utilizam blocos em suas implementações File.open("path_to_file") do |arquivo| faca_algo_com(arquivo) end seu arquivo é fechado automaticamente!
  • 16.
    Métodos: Definição érealizada pela keyworkd def Ruby suporta valor default e número variável de argumentos def metodo_qualquer(arg1, arg2 = "teste") puts arg1 puts arg2 end metodo_qualquer(1) ! #imprime na saida padrão: 1n “teste” metodo_qualquer(0, “UFLA”) ! #imprime na saida padrão: 0n “UFLA”
  • 17.
    Métodos: def add(*numeros) numeros.inject(0) do |soma, numero| soma + numero end end ! add(1) add(1, 2) add(1, 2, 3) add(1, 2, 3, 4)
  • 18.
    Classes: Definição érealizada pela keyword class e o construtor é o método initialize class Professor def initialize(nome) @nome = nome end ! def nome @nome end end ! p = Professor.new("Ricardo") p.nome
  • 19.
    Classes: Classes emRuby nunca são fechadas. Você pode alterar a classe que desejar em runtime! class Fixnum def +(another_integer) self * another_integer end end >> 5 + 2 # mesma coisa que -> 5.+(2) => 10 #oooopssss! with great power comes great responsibility!
  • 20.
    Classes: Herança éexpressada de uma maneira bem simples class Professor < Profissional def metodo_sobrescrito(nome) # super sem nenhum argumento # irá passar todos os argumentos # recebidos para o método # da classe pai resultado = super resultado end end
  • 21.
    Módulos: Agrupam métodos,constantes e variáveis de classe Não podem ser instanciados ou utilizados como subclasse module QualquerCoisa def self.algum_metodo ... end ! end ! QualquerCoisa.algum_metodo
  • 22.
    Módulos: Podem serincluídos em classes class Carro include MotorV8 include ABS include AirBag ! def acelerar #... end end
  • 23.
    Gem: É ogerenciador de pacotes utilizado pela linguagem Pode conter uma aplicação completa! $ gem install devise! $ gem install mysql2! $ gem install archruby
  • 24.
    Ecossistema: Garbage Collector Standard Library String encoding/transcoding Regexp engine Utilitários (ferramentas de debug, formatação de strings) Parser VM
  • 25.
    Recapitulando: definição demétodo class Professor def initialize(nome) if nome.eql? "" @nome = "Fulano" else condicional @nome = nome end end ! def nome @nome end end ! p = Professor.new("Ricardo") p.nome definição de classe variável de instância Constante chamada de método
  • 26.
  • 27.
    “ é umframework web open source otimizado para a felicidade e produtividade do programador. Faz com que você escreva código bonito favorecendo a convenção sobre configuração ” http://rubyonrails.org/
  • 28.
    Framework: “ Conjuntode componentes de software que provêem uma arquitetura e estrutura básicas para o desenvolvimento de uma aplicação. É uma aplicação semi pronta que deve ser extendida e personalizada ”
  • 29.
    Filosofia do Rails: Don’t repeat yourself (DRY): é uma sugestão para não repetir o mesmo código em vários lugares Convention over Configuration: o Rails faz suposições sobre o que você quer fazer e como você fará o que deseja Representational State Transfer (REST): é uma maneira de organizar sua aplicação em recursos e verbos padrões utilizados pelo protocolo HTTP
  • 30.
    Model View Controller(MVC): apresenta uma visão do model para o usuário View apresenta seleciona & renderiza utiliza, procura e controla Controller Model lógica do negócio, lógica do domínio controla a interação entre o usuário e o app
  • 31.
    Sub-componentes do Rails: Action Mailer: é um framework para desenvolver serviços de entrega de emails Action Pack: é um framework para responder e receber requisições web. Fornece mecanismos para rotas e definições de controllers que implementam ações e renderizam o resultado gerado Active Model: fornece várias interfaces que podem ser utilizadas pelo model
  • 32.
    Sub-componentes do Rails: Active Record: Conecta classes a tabelas do banco de dados, ou seja, é o ORM do Rails. Active Support: é uma coleção de classes utilitárias e extensões a standard library, que são úteis ao Rails Action View: é um framework para procurar e renderizar templates.
  • 33.
    Model View Controller(MVC): Action View apresenta seleciona & renderiza Action Controller utiliza, procura e controla Active Record (& Action Dispatch) (& Active Model)
  • 34.
    Exemplo ActiveRecord: classPerson < ActiveRecord::Base validates :email, :presence => true validates :surname, :presence => true, :if => "name.nil?" ! has_many :books end ! class Book < ActiveRecord::Base validates :name, :presence => true ! belongs_to :person end ! !p = Person.new(:email => nil, :name => nil, :surname => "Miranda") p.valid? # false puts p.errors # email can't be blank ! p1 = Person.first p1_books = p1.books
  • 35.
    Ambientes: Teste: éo ambiente que sua aplicação é executada quando seus testes automatizados estão sendo realizados Desenvolvimento: é o ambiente default quando você está trabalhando na sua aplicação Produção: é o ambiente em que sua aplicação é executada quando ela está no ar, sendo utilizada por usuários reais
  • 36.
    Desenvolvimento com testes: Os testes são feitos antes da implementação O Rails já vem preparado para o desenvolvimento orientado a testes Framework largamente utilizado para testes na comunidade Rails: Rspec
  • 37.
    Desenvolvimento com testes: describe Teacher do describe "requirements" do it "should have a name" do t = Teacher.new(:name => nil) t.should_not be_valid end end end
  • 38.
    Desenvolvimento com testes: Análise Teste Implemente Teste Refatore Teste
  • 39.
    Migrations: É umaforma eficiente de alterar a base de dados Mantém o controle das alterações feitas e garante uma estrutura de base idêntica entre os desenvolvedores Facilita modificações na base de produção
  • 40.
    Migrations: class CreateTeacher< ActiveRecord::Migration def change create_table :teachers do |t| t.string :name t.string :cpf t.timestamps end end end
  • 41.
    Assets pipeline: Éum framework para concatenar e reduzir ou comprimir arquivos JavaScript e CSS. Adiciona a possibilidade de escrever os assets em outras linguagens e pre-processadores como: CoffeeScript, Sass e ERB
  • 42.
  • 43.
  • 44.
    Rake: É umsoftware para gerenciar tarefas. Similar ao make As tarefas são colocadas em Rakefile, que contêm código Ruby Migrations e testes automatizados são exemplos de tarefas executadas com o Rake
  • 45.
    Rake: namespace :namespace_da_sua_taskdo desc "descricao da sua task" task :nome_da_sua_task => :dependencia_da_sua_task do tarefa_a_ser_executada end end
  • 46.
    Scaffold: É umgerador de código que proporciona um desenvolvimento mais rápido $ rails generate scaffold Post nome:string titulo:string conteudo:string
  • 47.
    Console: É umRead Eval Print Loop (REPL) utilizado para interagir com a sua aplicação Rails sem precisar utilizar a interface web para isso $ rails c >> Post.all >> Post.first >> p = Post.new(! :nome => “Teste”, ! :titulo => “titulo teste”, ! :conteudo => “Conteudo do post”)
  • 48.
    Hello Rails: $rails new hello_rails $ cd hello_rails $ rails generate controller home index $ vim app/views/home/index.html.erb => <h1> Hello Rails! </h1> $ vim config/routes.rb => root :to => “home#index” $ rails server Abra seu browser e acesse o endereço http://localhost:3000
  • 49.
  • 50.
    Recapitulando: MVC Componentes Ambientes Testes Migrations Assets pipeline Rake Scaffold
  • 51.
  • 52.
    NÃO vire REFÉM do Framework escolha a ferramenta certa para o problema que você está enfrentando
  • 53.
    Software só tem valor quando está sendo utilizado
  • 54.
    O que vocêsprecisam… Terminal para executar seus comandos e inicializar o rails server Editor de texto para escrever/editar códigos Browser para visualizar e interagir com a sua aplicação Ruby, para programar sua aplicação Rails, o framework para desenvolver aplicações web
  • 56.
    OBRIGADO! twitter: @sergiohenrique sergiohenriquemiranda.com.br