Primeiros passos com Ruby on Rails
Vinícius Alonso
Quem sou eu ?
- Formando em Tecnologia em Sistemas para a Internet - UTFPR/GP
- Trabalho com Ruby desde 2013
- Membro do Grupo de Usuários Ruby do Paraná (GURU PR)
Ruby On Rails
Linguagem de Programação


Framework
A linguagem Ruby
- Criada no Japão em 1993 por Yukihiro "Matz" Matsumoto
- Porém, só foi levada ao público em 1995
- Matz queria desenvolver uma linguagem mais poderosa que Perl e mais orientada a objetos que Python

Quem usa Ruby ?






Ruby
- Linguagem Interpretada
- Multiparadigma
- Orientada a Objetos
- Funcional
- Imperativa
- Tipagem dinâmica e forte


irb
- Interactive Ruby
- Ferramenta por meio da qual é possível testar código ruby
Ruby
puts "Hello Ruby!"
Variáveis
@name #variável do objeto
@@name #variável da classe
name #local
$name #global
Símbolos
- São objetos instanciados da classe Symbol
- Implementão o design pattern Flyweight
Símbolos
#Syntax de um símbolo
:name
:'name'
:'full-name'
Símbolos
'ola'.object_id == 'ola'.object_id #false
:ola.object_id == :ola.object_id #true
Range
(1..10) # Intervalo de 1 à 10
(1...10) # Intervalo de 1 à 9
('a'..'z') # Intervalo de a à z
(1..10).to_a # Convertendo para array
Condicional
age = 18
if age >= 18
puts "Maior de idade"
else
puts "Menor de idade"
end
Loop
for number in (0..10)
puts number
end
Loop
i = 0
MAX = 5
until i > MAX do
puts("Valor de i = #{i}")
i += 1
end
Loop
5.times { puts "Vai Timão!!!" }
Array
# Declarando um novo array
array = []
array = Array.new
Array
array = [1,2,3,4,5]
# Percorrendo um array
array.each { |value| puts value }
Array
array = []
# Adicionando elementos
array.push("FTSL")
array << 10
array << :utfpr
Array
array = ["FTSL", 10, :name]
# Removendo elementos
array.delete("FTSL")
array.pop
array.clear
Array
array = [1,2,3,4,5]
array.length # Tamanho do array
array.first # Primeiro elemento
array.last # Último elemento
array.index(3) # Retorna a posição
array.include?('m') # Contém o elemento
Hash
- É uma coleção de chaves e valores
- Também chamados de arrays associativos
- Diferente do array, um hash pode utilizar qualquer elemento como chave
Hash
# Declarando um novo hash
h = Hash.new
h = {}
Hash
hash = {
1 => 'Curitiba',
true => 20,
'utfpr' => :college,
}
hash[:event] = "FTSL" #Adicionando
hash.delete(:event) #Removendo elemento
Blocos de código
- São blocos à serem executados, semelhantes a funções anônimas em outras linguagens
Blocos de código
# Syntax de um bloco
puts { "Hello!!!" }
puts do
"Hello!!!"
end
Blocos de código
# Exemplo de uso
pairs = [1,2,3,4,5,6].select do |n|
n % 2 == 0
end
pairs.each { |n| puts "valor: #{n}" }
Orientação a Objetos
- Tudo em ruby é um objeto
- Não existem tipos primitivos
Classes
# Definindo uma classe
class Person
end
# Instanciando um objeto
person = Person.new
Atributos
class Person
def initalize name, age
@name, @age = name, age
end
end
# Instanciando
Person.new 'Vinícius', 25
Atributos
class Person
attr_reader :name
attr_writer :age
@@count = 0
def initialize hash
@name = hash[:name]
@age = hash[:age]
@@count += 1
end
end
Visibilidade
class Person
def talk
puts "Estou falando ..."
end
private
def other_behavior; end
protected
def different_behavior; end
end
Herança
class Person
def initialize name
@name = name
end
end
class Worker < Person
def initialize name, profession
super name
@profession = profession
end
end
Módulos
- São coleções de métodos e constantes
- Geralmente utilizados como namespaces ou mixins
Módulos
module Example
end
module Example
PI = 3.14159
def show_message
puts "Estou aqui ..."
end
end
Módulos
# Módulo usado como namespace
module API
class Book
end
end
module ADMIN
class Book
end
end
Módulos
# Módulo usado como mixin
module Calculator
def sum_numbers(*numbers)
numbers.map.reduce(:+)
end
end
Módulos
# Módulo usado como mixin
class Example
include Calculator
end
class Example
extend Calculator
end
obj = Object.new
obj.extend Calculator
Metaprogramação
- Uma técnica que permite manipular as classes e objetos em tempo de execução
- Tornou possível a existência do framework Ruby on Rails
Metaprogramação
- method_missing
- class_eval
- define_method
Metaprogramação
class Person
def method_missing name, args=nil
puts "method_missing: #{name}"
end
end
person = Person.new
person.test_missing
Metaprogramação
class Person
def method_missing(name,*args,&block)
name = name.to_s
_class = class << self; self; end
_class.class_eval do
define_method(name) do
puts "Método novo: #{name}"
end
end
end
end
Bibliotecas Ruby
- São chamadas de gems
- Existe um vasto número de gems os mais diversos tipos de uso
Bibliotecas Ruby
# Instala uma nova gem
gem install <nome_da_gem>
# Lista as gems instaladas
gem list
# Carrega um servidor local com a
# documentação das gems instaladas
gem server
Bibliotecas Ruby
- O comado gem vem de um serviço chamado Rubygems
- Que é onde as gems são salvas, após serem publicadas
Bundler
- Gerenciador de dependências utilizado em projetos Ruby
- Facilita a instalação, atualização e remoção de gems

Ruby On Rails
Ruby on Rails
- Criado em 2003 por David Heinemeier Hansson, foi extraído do projeto Basecamp
- Tornou-se um projeto open source em Julho de 2004
- Possui uma comunidade muito ativa

Comunidade





Rails Core Team
- Grupo de desenvolvedores que determina os rumos que o framework deve tomar
- Possui uma forte participação de brasileiros
Rails Core Team



José
Valim
Rafael
França
Carlos
Antonio
Ruby on Rails
- Framework para o desenvolvimento web, focado na simplicidade e agilidade
- Segue premissas como convenção sobre configuração e DRY (Don't Repeat Yourself)
- Implementa o padrão MVC (Model-View-Controller)
MVC
- Padrão que visa separar as responsabilidades, muito utilizado em frameworks para web
- M - Model, responsável pelas regras de negócio
- V - View, reponsável pela interação com o usuário
- C - Controller, intermediário entre a View o Model
MVC

Aplicação
- Será desenvolvido um controle para biblioteca, por meio da qual o usuário poderá
- Cadastrar autores e livros
- Emprestar e devolver livros
- Fazer login
- Buscar por títulos
Iniciando a Aplicação
$ rails new library
$ cd library/
rails server
Página Inicial
$ rails generate controller Welcome index
Adicionando Bootstrap
# Gemfile
gem 'bootstrap-sass', '~> 3.3.6'
bundle install
# renomear app/assets/stylesheets/application.css
# para app/assets/stylesheets/application.scss
@import "bootstrap-sprockets";
@import "bootstrap";
# app/assets/javascripts/application.js
//= require bootstrap-sprockets
Asset Pipeline
- Uma aplicação web possui muito conteúdo estático para ser carregado a cada requisição. Ex:
- CSS
- Javascript
- Imagens
- O asset pipeline fornece para o Rails uma forma de minifica-los, diminuir o número de arquivos e utilizar DSL's
CRUD de Autores
$ rails g scaffold Author name:string
$ rails db:migrate
CRUD de Livros
$ rails g scaffold Book title:string \
available:boolean \
author:references
$ rails db:migrate
Paginação
# Gemfile
gem 'will_paginate'
gem 'will_paginate-bootstrap'
# app/controllers/books_controller.rb
@books = Book.paginate(page: params[:page],
per_page: 10)
# app/views/books/index.html.erb
<%= will_paginate @books,
renderer:
BootstrapPagination::Rails %>
Associações
- Relacionamento entre classes são muito importantes
- Por essa razão o ActiveRecord fornece uma boa forma de relacionar nossas classes
Associações

Associações

Upload de Imagem
# Gemfile
gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'
gem 'mini_magick'
bundle install
rails g uploader Image
# Adicionar multipart para o formulário dos livros
# app/books/_form.html.erb
# app/models/book.rb
mount_uploader :image, ImageUploader
Autenticação
# Gemfile
gem 'devise'
bundle install
rails g devise:install
rails g devise User
rails db:migrate
# before_action :authenticate_user!
Encerrando
- Nesse ponto faltam apenas:
- Busca por título
- Empréstimo
- Devolução
Referências
Minicurso Ruby on Rails
By Vinícius Alonso
Minicurso Ruby on Rails
Minicurso sobre Ruby on Rails, apresentado no FTSL 2016 na UTFPR em Curitiba.
- 992