Ruby on Rails
Ruby on Rails
Aprendizado evolutivo do Ruby até o desenvolvimento de aplicações em Rails
Roteiro
Primeiro Dia Ruby Básico Ruby OO Rails Básico Segundo Dia Rails AvançadoPalestrantes
Glauco Roberto Munsberg dos Santos
Acadêmico da C. Computação
Presidente da Empresa Júnior Hut8 Presidente do CREJ
glaucoroberto.com
glaucomunsberg@gmail.com (53)81233559
Palestrantes
Daniel Krolow Retzlaff
Acadêmico da C. Computação
Dir. Adm. Fin. da Empresa Júnior Hut8
danielkretzlaff@gmail.com (53)91753766
Ruby
$ ruby -v ruby 2.1.* $ rails -v rails 4.1.* Vamos testar!Ruby on Rails
Introdução a Ruby
Uma linguagem Dinâmica, Open Source com foco na Simplicidade e na
Produtividade. Tem uma sintaxe elegante
Introdução a Ruby
Curiosidades da Linguagem/Historia
O seu criador: Yukihiro Matz Matsumoto
Linguagens Favoritas: Perl, Smalltalk, Eiffel, Ada, e Lisp Nascido : 1995
Introdução a Ruby
Curiosidades da Linguagem/Historia
“Eu queria uma linguagem interpretada que fosse mais poderosa que o Perl e mais orientada a objetos do que o
Introdução a Ruby
Curiosidades da Linguagem/Historia
A quarta linguagem mais usada. Cresce a 10% ao ano.
O que faz o Rails?
Ruby on Rails é um framework de
desenvolvimento web (gratuito e de
código aberto) otimizado para a
produtividade sustentável e da diversão do programador. Ele permite que você
escreva código de forma elegante,
favorecimento a convenção ao invés de
O que faz o Rails?
Curiosidades do Framework/Historia
Rails foi criado em 2003 por David
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
DRY - Don't Repeat Yourself
A idéia por traz deste conceito no Rails, é a de proporcionar ao programador métodos que abstraia ao máximo todo o
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
CoC - Convention over Configuration
Ruby On Rails é estudando bastante todas as suas técnicas para seguir rigorosamente seus "padrões de sucesso".
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
Agilidade
Ruby On Rails segue fielmente a maioria dos conceitos do desenvolvimento Agile, TDD, BDD e DDD.
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
Foco no negócio
Ao criar um projeto, 90% do tempo será
investido fazendo o que mais agrega valor ao sistema, que são as regras de negócio,
layout, usabilidade, modelagem e testes, os outros 10% serão gastos configurando
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
A favorita das startups
Muitas das startups estão adotando Rails em alguns dos seus projetos, pois permite a eles se empenharem no que mais almejam, que é inovar em seus projeto, desenvolvendo-o em curto prazo.
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
Problemas grandes, soluções pequenas
Diferente das "linguagens clássicas" (Java, C#, C++, PHP) Ruby possui uma sintaxe
simplista e muitos métodos poderosos que facilitam muito a vida do programador.
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
Problemas grandes, soluções pequenas
Diferente das "linguagens clássicas" (Java, C#, C++, PHP) Ruby possui uma sintaxe
simplista e muitos métodos poderosos que facilitam muito a vida do programador.
O que faz o Rails?
Conceitos básicos de estrutura e organização do framework
Problemas grandes, soluções pequenas
Diferente das "linguagens clássicas" (Java, C#, C++, PHP) Ruby possui uma sintaxe
simplista e muitos métodos poderosos que facilitam muito a vida do programador.
Ruby on Rails
Ruby
$ irb
$ ruby <file>
Ruby
diz = “Meu nome é meu nome”
puts diz
diz[‘meu nome’] = “glauco roberto”
puts diz
puts diz.upcase
Ruby
Ruby
1.class
“a”.class
self.class
Ruby
Ruby
$ 1.methods
$ 1.methods.sort
Ruby
Ruby
def soma a, b a + b end soma 1,2 soma(1,2) Método e RetornoRuby
def teste(*parametros)
parametros.each { |parametro| puts parametro } end
teste 1,2,3,4,5,6,7 teste("a",1,2.2)
Ruby
Ruby
p1 = lambda do
puts “olá código p1” end
p2 = Proc.new {
puts “olá código p2”
}
p2.call
p1.call
Ruby
Ruby
Constante = 1 Constante = 2
Ruby
Ruby
a = “texto1”
b = “O #{a} está inserido”
puts b
Ruby
puts “algo”.object_id puts “algo”.object_id puts :“algo”.object_id puts :algo.object_id puts :symbol.object_idRuby
Ruby
a = -2..2 b = -2..2 a.each do |v| puts “#{v}” end b.each do |v| puts “#{v}” end intervalo NuméricoRuby
Ruby
def testa_valor val if val
puts “#{val} é considerado verdadeiro pelo Ruby” else
puts “#{val} não é considerado verdadeiro pelo Ruby” end
end
Ruby
Ruby
arr1 = []
arr1 = [‘a’,1,:aaaa]
arr2 = 0..10
arr2.inject(0) do |val, it|
val + it
end
Ruby
Ruby
h = {1 => “valor algo”, “b”=> 1234, :posicao_tal => :posit } Hashes
Ruby
Ruby
a = 0 if a == 0 puts “zero” elsif a == 1 puts “um” elseputs “não sei que numero é este”
end
Ruby
Ruby
a = 5 case a when 1..3 puts “entre 1 e 3” when 4 puts “a é 4” when “algo” puts “É algo!” elseputs “Nenhuma anterior” end
Ruby
Ruby
i = [11,21,3,54,6] while b = i.pop puts b end Classes e MétodosRuby
Ruby
for i in 1..5 puts i end for a in %w{a b c d} puts a end Classes e MétodosRuby
Ruby
nome #Var. Local
@nome #Var. de Instância
@@nome #Var. de Classe
$nome #Var. global
Ruby
Ruby
class Carro def initialize(fabricante,modelo,ano) @fabricante = fabricante @modelo = modelo @ano = ano @chassi = “aushaiu1ash” endattr_accessor :fabricante, :modelo, :ano
attr_reader :chassi
attr_writer :<Outra coisa qualquer>
end
clio = Carro.new “Renaut”, “clio”, “2000” puts clio.modelo
Ruby
require ‘./arquivo_anterior’ class Clio < Carro
@@fabricante = “Renault” @@modelo = “clio” def initialize(ano) super(@@fabricante,@@modelo,ano) end end Classes e Métodos
Ruby
require ‘arquivo_anterior_1’ class Fabrica def self.Clio Clio.new(2003) end def self.MeganeCarro.new “Renault”, “Megane”, 2003 end
end
Ruby
Ruby
ClienteEspecial -> cliente_especial.rb Classe -> Primeira maiuscula
Rails
$ rails new app $ rails s
on Rails
$ rails g scaffold task title:string description:text completed:boolean
on Rails
$ rake db:migrate
on Rails
# You can have the root of your site routed #root 'welcome#index'
root :to => "tasks#index"
on Rails
Rails
$ rails COMMAND
generate (alias “g”) console (alias “c”)
server (alias “s”) // $ rails s
dbconsole (alias “db”) new
$ bundle update | install $ rake db:migrate
Rails
Ruby
Ruby
$ rails generate migration task created_at:datetime
Ruby
$ rake db:migrate
Ruby
Ruby
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', '~> 0.4.0', group: :doc
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', group: :development
gem "twitter-bootstrap-rails"
Ruby
$ bundle update
Ruby
$ rails generate bootstrap:install static
Ruby
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
* file per style scope. * *= require bootstrap_and_overrides *= require_tree . *= require_self */ on Rails
Ruby
Use Font Awesome icons (default)
To use Glyphicons sprites instead of Font Awesome, replace with "require twitter-bootstrap-static/sprites"
=require twitter-bootstrap-static/fontawesome */
@import "twitter/boostrap"
Ruby
$ rails g bootstrap:themed Tasks
Ruby
Vamos Melhorar!
$ rails g controller Principal
$ rails g bootstrap:themed Principal
Ruby
index.erb.html
<div class="list-group">
<a href="#" class="list-group-item disabled">
Cadastros Básicos </a>
<a href="/tasks" class="list-group-item">Trasks</a>
</div>
Ruby
routes … resources :principal root 'principal#index' … on RailsRuby
Aplicações Avançadas
Ruby
A Hut8 está com um problema:
Quer ter um cadastro de empregados e saber algumas informações como
Nome Sobrenome Idade Gênero
Categoria na Empresa Email para contato
Como fazer isso de forma rápida?!
Ruby
$ rails g scaffold Nivel tipo:string
Ruby
$ rails g scaffold Sexo tipo:string
Ruby
$ rails g scaffold Funcionario nome:string sobrenome:string data_nas:date sexo: references nivel:references email:string
Ruby
$ rails g scaffold Empresa nome_do_projeto:string funcionario:references data_da_fundacao:date
Ruby
Principal/index.erb.html
adicionar:
<a href="/nivels" class="list-group-item">Niveis</a> <a href="/sexos" class="list-group-item">Sexos</a>
<a href="/funcionarios" class="list-group-item">Funcionarios</a> <a href="#" class="list-group-item disabled">
Programas </a>
<a href="/empresas" class="list-group-item">Empresa</a>
Ruby
No arquivo da model nivel.rb: has_many :funcionarios
No arquivo da model sexo.rb: has_many :funcionarios
No arquivo da model funcionario.rb: has_many :empresas
Ruby
# Na controller funcionario_controller.rb
# Add Nivel a Tabela Funcionario
if params[:nivel]
@funcionario.nivel = Funcionario.find(params[:nivel]) end
# Add Sexo a Tabela Funcionario
if params[:sexo]
@funcionario.sexo = Funcionario.find(params[:sexo]) end
Ruby
# Na Controller empresa_controller.rb
# Add Funcionario a Tabela Empresa
if params[:funcionario]
@empresa.funcionario = Empresa.find(params[:funcionario]) end
Ruby
Vejamos o que deu :D
Ruby
# No_form.html.erb do funcionario
<div> <p> <%= f.label :sexo_id %><br /> <%= f.collection_select(:sexo_id, Sexo. order(“tipo”), :id, :tipo, {:prompt => true}) %> </p> </div>
<div> <p> <%= f.label :nivel_id %><br /> <%= f.collection_select(:nivel_id, Nivel.order(“tipo”), :id, :tipo, {:prompt => true}) %> </p> </div>
Ruby
# Na index.html.erb do funcionario:
<td><%= funcionario.sexo.tipo %></td> <td><%= funcionario.nivel.tipo %></td> #Na show, assim:
<p> <b>Sexo:</b> <%= @funcionario.sexo.tipo %> </p> <p> <b>Nivel:</b> <%= @funcionario.nivel.tipo %> </p>
Ruby
# Na _form.html.erb do Empresa:
<p> <%= f.label :funcionario_id %><br /> <%= f.collection_select(:funcionario_id, Funcionario.order(‘nome’), :id, :nome, {:prompt => true}) %> </p></div>
Ruby
# Na index.html.erb da empresa: <td><%= empresa.funcionario.nome %></td> # Na show.html.erb da empresa: <p> <b>Funcionario:</b> <%= @empresa.funcionario.nome %> </p> on RailsRuby
Aplicações Avançadas - Com Estilo
Ruby
$ rails g bootstrap:themed nivels $ rails g bootstrap:themed sexos
Ruby
Validações
Ruby
class Nivel < ActiveRecord::Base has_many :funcionarios
validates :tipo, presence: true
end
Ruby
Validações Avançadas
Ruby
class Task < ActiveRecord::Base
validates :title, length: { minimum: 2 }
validates :description, length: { maximum: 500 }
end
Ruby
Semear
Ruby
Sexo.create(tipo:"Masculino")
Sexo.create([{tipo:"Feminino"},{tipo:"Não declarado"}])
Nivel.create([{ tipo: "Diretor"},{tipo:"Conselheiro"}, {tipo:"Associado"},
{tipo:"Trainee"} ])
Ruby
Meu Layout
Ruby
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">
<img alt="Brand" src="<%= image_tag 'hut8_logo.jpg', :style => "height: 50px;" %>"> </a> </div> </div> </nav> <div class="container"> <div class="col-md-12"> <%= yield %> </div> </div> on Rails
Ruby
Multiplos Layouts
Ruby
… <div class="container"> <div class="col-md-3"> MENU </div> <div class=”col-md-9”> <%= yield %> </div> </div> … on RailsRuby
class NivelsController < ApplicationController
before_action :set_nivel, only: [:show, :edit, :update, :destroy] layout "application_menu"
Ruby
Internacionização
Ruby
config.i18n.available_locales = [:en, :"pt-BR"] config.i18n.default_locale = :"pt-BR"
Ruby
class PrincipalController < ApplicationController before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end end
Ruby
<ul class="nav navbar-nav navbar-right">
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", :locale=>'en'%>
<% else %>
<%= link_to "Portugues", :locale=>'pt-BR'%>
<%end%>
</ul>