minicurso ruby on rails

Download Minicurso Ruby on Rails

Post on 15-Jul-2015

168 views

Category:

Software

1 download

Embed Size (px)

TRANSCRIPT

  • RUBY ON RAILSMAURCIO EDUARDO LOSCHI BATISTA

  • RUBY

    Interpretada

    Dinmica

    Multiparadigma

  • HISTRIA

    Criada por Yukihiro Matz Matsumoto em Fev/1993.

    Primeira release pblica (v0.95) em Dez/1995

    Primeira verso estvel em Dez/1996

  • AS INSPIRAES DE MATZ

    Perl Smalltalk Eiffel Ada Lisp

  • RUBY POR MATZ

    Ruby is simple in appearance, but is very complex inside, just like our human body.

    Matz -

  • $ irb

  • LITERAIS

    1 # nmero inteiro'a' # string:a # smbolo[1, 'a'] # array{a: 1, 'a' => 2} # hash0..9 # range inclusivo0...10 # range exclusivotrue # booleano verdadeirofalse # booleano falsonil # nulo

  • ESCOPO DE VARIVEIS

    v = 1 # escopo local@v = 2 # escopo da instncia@@v = 3 # escopo da classe$v = 4 # escopo globalprint v, @v, @@v, $v # 1234

  • CONSTANTES

    NO = 2 # tudo que se inicia com letra maiscula uma constanteNO = 3 # warning: already initialized constant NO # warning: previous definition of NO was here

  • MTODOS

    s = 'abc's.reverse # => 'cba's # => 'abc's.reverse! # => 'cba's # => 'cba's.include? 'a' # => true

  • MTODOS E PARMETROS

    def splat(*args) p argsend

    def keywords(x:, y: 1) print x, yend

    splat 1, 2, 3 # [1, 2, 3]keywords x: 2 # 21

  • MTODOS MENSAGENS

    'abc'.reverse # => "cba"'abc'.send :reverse # => "cba"

  • to_*

    10.to_f # => 10.010.to_s # => "10"'10'.to_i # => 10'ab'.to_sym # => :ab(1..5).to_a # => [1, 2, 3, 4, 5]

  • ESTRUTURAS DE CONTROLE

    def m(x) if x > 0 puts x elsif x == 0 puts "zero" else puts "-" endend

    m 1 # +m 0 # zerom -1 # -

    def u(x) unless x.nil? puts x endend

    u 1 # 1u nil

    x = 0while x < 5 print x x += 1end # 01234

    for x in 0..4 print xend # 01234

    x = 0until x == 5 print x x += 1end # 01234

  • MODIFICADORES

    a = []a.push(a.length) while a.length < 3a.push(a.length) until a.length == 5p a if a.length > 4 # [0, 1, 2, 3, 4]p a unless a.length < 5 # [0, 1, 2, 3, 4]

  • BLOCOS

    [1, 2, 3].map { |i| i**2 } # => [1, 4, 9]

    [1, 2, 3].each do |i| puts i puts i**2end

  • BLOCOS E ARGUMENTOS

    def block_yield yield 'BLOCO'end

    def block_call(&b) b.call 'BLOCO'end

    block_yield { |s| puts s.downcase } # blocoblock_call { |s| puts s.reverse } # OCOLB

  • FOR MAIS RUBISTA

    for x in 0..4 print xend

    (0..4).each { |x| print x} # 01234

  • FILOSOFIA DO RUBY

    Felicidade do programador Orientao objeto Flexibilidade

  • Ruby lhe permite programar de forma eficiente e divertida

  • TUDO UM OBJETO

    I wanted a scripting language that was more powerful than Perl, and more object-oriented

    than Python.Matz -

  • MODELO DE OBJETOS DO RUBY

  • class Pessoa attr_accessor :nome, :idade def to_s "Nome: #{nome}; Idade: #{idade}" endend

    eu = Pessoa.neweu.nome = "Eu"eu.idade=(101)puts eu # Nome: Eu; Idade: 101

  • class Pessoa attr_accessor :nome, :idade def to_s "Nome: #{nome}; Idade: #{idade}" endend

    eu = Pessoa.neweu.nome = "Eu"eu.idade=(101)puts eu # Nome: Eu; Idade: 101

    self.nome self.idade

  • MODULE

    module M def self.m(x) puts x endend

    M.m 1 # 1

  • MODULE & NAMESPACE

    module M class C def m(x) puts x end endend

    M::C.new.m 1 # 1

  • MODULE & MIXIN

    module M def m(x) puts x endend

    class C include Mend

    C.new.m 1 # 1

  • TODAS as classes podem ser modificadas a qualquer momento (tambm conhecido como monkeypatch)

    CLASSES ABERTAS

  • CONTANTO ALGARISMOS DE UM NMERO

    10.length #NoMethodError: undefined method `length' for 10:Fixnum

    class Fixnum def length to_s.length endend

    10.length # => 2

  • MTODOS FANTASMAS

    class C def method_missing(meth, *args) puts "#{meth} chamado com #{args}" yield args if block_given? endend

    o = C.newz = o.matematica(5, 2) { |x, y| x * y } # matematica chamado com [5, 2]puts z # 10

  • Linguagem dedicada a um domnio de problema especfico HTML, CSS, SQL (DSLs externas)

    Ruby uma GPL (linguagem de propsito geral) Permite a criao de DSLs internas (Capybara,

    RSpec)

    DSL

  • # rspecdescribe "true or false" do it "should be true" do expect(true || false).to be true endend

    # capybaravisit '/'fill_in 'e-mail', with: 'mail@mail.com'click_on 'Ok'

  • ECOSSISTEMA

    RubyGems Bundler Rake

  • RAILS

    Framework MVC de aplicaes web Criado em 2003 por David Heinemeier

    Hansson Extrado do Basecamp + de 3400 contribuidores

  • FILOSOFIA DO RAILS

    DRY: no se repita COC: conveno sobre configurao Tem o mesmo propsito do ruby: fazer os

    programadores felizes

  • MVC ORIGINAL

  • Banco de Dados

    Rails routes

    ActionController

    ActionView ActiveRecord

    1

    2

    4

    5

    6

    7

    8 3

    1. navegador envia a requisio2. roteamento encontra o controller3. controller requisita o model4. model requisita os dados5. BD retorna os dados6. model retorna7. controller requisita a renderizao8. view retorna a pgina9. controller responde a requisio

    HTTP com a pgina9

    ARQUITETURA

  • $ rails new notas$ cd notas

  • DIRETRIO app assets: js, css, imagens, etc. controllers: controladores do MVC

    application_controller.rb: controller geral da aplicao helpers: mtodos auxiliares para controllers e views mailers: classes para enviar e-mails models: modelos do MVC

    concerns: comportamentos compartilhados por modelos views: Vises do MVC

    layouts: layouts para os templates

  • DIRETRIO testTestes da classes da aplicao

    fixtures: dados para os testes integration: testes de integrao de todos

    os componentes da aplicao

  • DIRETRIO config environments: configuraes exclusivas para cada

    ambiente de execuo Rails prov 3 por padro: development, test e production

    initializers: rotinas de inicializao locales: tradues application.rb: configuraes comuns para todos os

    ambientes database.yml: configuraes do banco de dados routes.rb: roteamento do rails

  • OUTROS DIRETRIOS bin: wrappers de executveis db: rotinas relacionadas persistencia

    migrate: migraes de BDs relacionais lib: rotinas no especficas da aplicao

    assets: assets no especficos da aplicao tasks: tarefas personalizadas do rake

    log: logs da aplicao public: arquivos servidos diretamente pelo servidor

    web tmp: arquivos temporrios vendor: rotinas criadas por terceiros

    assets: assets criados por terceiros

  • Gemfile

    gem 'rails-i18n', github: 'svenfuchs/rails-i18n', branch: 'master'

    gem 'devise'gem 'devise-i18n'

    gem 'bootstrap-sass'gem 'autoprefixer-rails'

    gem 'mailcatcher', group: :development

  • $ bundle$ rails g devise:install

  • config/application.rb

    config.i18n.default_locale = :"pt-BR"

  • config/environments/development.rb

    config.action_mailer.default_url_options = {host: 'localhost'}config.action_mailer.delivery_method = :smtpconfig.action_mailer.smtp_settings = {address: 'localhost', port: 1025}

  • $ mailcatcher$ rails s$ rails g devise User$ rake db:migrate

  • YAML

    Padro amigvel de serializao de dados

    Baseada em indentao

  • test/fixtures/users.yml

    eu: email: eu@mail.com encrypted_password: "..."

    voce: email: voce@mail.com encrypted_password: "..."

    $ rails c> User.new(password: "12345678").encrypted_password =>

  • Desenvolvimento Orientado a Comportamento Outside-in Testa-se o comportamento, no a

    implementao

    BDD

  • Gemfile

    gem 'capybara', group: [:development, :test]gem 'capybara-webkit', group: [:development, :test]

  • test/test_helper.rb

    # require 'minitest/mock'require 'capybara/rails'# class ActionDispatch::IntegrationTest include Capybara::DSLend# class ActionController::TestCase include Devise::TestHelpersend

  • $ bundle$ rails g integration_test notes_listing

  • TESTES DE INTEGRAO (ACEITAO)

    Testes de alto nvel (caixa preta)

    Simulam a interao do usurio

    Baseados em cenrios

  • test/integration/notes_listing_test.rb (continua...)

    class NotesListingTest < ActionDispatch::IntegrationTest setup do visit '/users/sign_in' fill_in 'Email', with: users(:eu).email fill_in 'Password', with: '12345678' click_on 'Log in' end

    teardown do Capybara.reset_sessions! end

  • test/integration/notes_listing_test.rb (continua...)

    test 'listagem de notas' do visit '/' assert page.has_content? notes(:one).title assert page.has_content? notes(:one).body assert page.has_no_content? notes(:two).title assert page.has_no_content? notes(:two).body end

  • test/integration/notes_listing_test.rb

    test 'cor das notas' do visit '/' assert page.all('.note .well').first['style'] .include? "background-color: #{notes(:one).color}" endend

  • $ rake test

  • config/routes.rb

    Rails.application.routes.draw do resources :notes, path: '/' # ...

  • $ rails g controller notes

  • TESTES FUNCIONAIS

    Testa o resultado de uma funcionalidade

    Efeitos colaterais e resultados i