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.

  • 878