Workshop Ruby on Rails dia 2 ruby-pt
-
Upload
pedro-sousa -
Category
Technology
-
view
1.648 -
download
3
description
Transcript of Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails
Dia 2
Apresentação Ruby on Rails
REAL
baseado em necessidades reais
DRY
elimina tarefas repetitivas
COC
adopta convenções
ÁGIL
aberto a mudanças no desenvolvimento
PrincípiosDRY: Don’t Repeat Yourself
Cada coisa no seu sítio
Reduzir a quantidade de código reduz erros
COC: Convenção sobre Configuração
Torna as aplicações mais fáceis de entender
Menos trabalho de desenvolvimento
Só precisamos de configurar situações extra-ordinárias
• Desenhado para a “felicidade” do programador
• Felicidade + Motivação = produtividade
• Ambiente de testes incluído
• Flexibilidade perante as mudanças
• Velocidade de desenvolvimento (agilidade)
• Beleza do código
Controller
•Recebe os pedidos http do utilizador
•Prepara a informação que vai ser mostrada ao utilizador.
•Responsável por :
• apresentar os resultados
• gerir o diálogo
Controller
•Filtros (filters)
•Permite executar código antes/depois das acções
•Permite saltar as próprias execuções das acções
•Muito útil para autenticação e outros...
•Alguns exemplos:
• before filter, after filter, around filter
MODEL
•Models representam as tabelas das bases de dados (bd)
•Declaração é feita de forma limpa e legível
•Não é necessário indicar nome de tabelas ou chaves primárias/estrangeiras mas tudo pode ser personalizado!
•Relacionamentos de forma pré-definida
• has_many
• belongs_to
• has_and_belongs_to_many
MODEL
•Migrations permitem alterar a base de dados
•Permitem actualizar facilmente a estrutura da base de dados.
•Não é preciso saber SQL, nem mexer na BD directamente.
•Podemos criar tabelas, chaves, indexes, etc.
MODEL
VIEW
•Gerem a apresentação visual da aplicação
•Layouts guardam o aspecto geral das páginas
•Existe separação entre dados e aspecto
• ex: xml, html, json, vcard, atom, etc...
•Helpers
• Objectivo: Simplificar e não repetir código
• Formulários
• Geração de URL’s
• Geração de Javascript (Prototype + Script.aculo.us)
• Formatos de texto / números / datas ...
VIEW
Ambiente de Desenvolvimento
Várias opções
Aptana Studio
NetBeans
Eclipse
Textmate
Vim
Ruby in Steel (Visual Studio)
Bases de Dados
Não limitado a uma plataforma
SQLite (incluído na framework)
MySQL
PostgreSQL
Oracle
SQL Server
Outros...
Live Coding
criar uma aplicação
•mac> cd projectos •mac> rails projecto_novo
create app/viewscreate app/controllers create app/helpers create app/models : : : create log/development.log create log/test.log
Cada coisa no seu lugarAplicação (MVC)
ControladoresModelos
Vistas
Público
dispatchersImagens
CSSJavascript
3 ambientes integrados
Base de Dados1 tabela = 1 modelo
Classes ficam guardadas em app/models e estendem ActiveRecord::Base
Nomes das tabelas no plural e nomes das classes no singular
As colunas são mapeadas como atributos do modelo
As tabelas têm uma chave primaria ( id )
Excepções
self.table_name = ‘my_legacy_table’
self.primary_key = ‘my_id’
self.pluralize_table_names = false
self.table_name_prefix = ‘my_app’
Active RecordCRUD
Create: create, new
Read: find, find_by_<attr>
Update: save, update_attributes
Delete: destroy
Boas Prácticas
Não colocar muito código no controller/view. O objectivo é models com muito código e controllers com pouco.
Routes
Routes são regras que procuram mapear URL’s à hash dos Params.
A hash dos params possui o controller e a action a invocar.
Routes são definidas no fich config/routes.rb e são aplicados pela ordem que aparecem.
Se não houver comparação possível, devolve erro 404.
REST
REST é uma alternativa ao SOAP e uma maneira de adicionar uma API tipo web service a uma aplicação.
O estado do sistema está dividido em recursos que são alcançados via hyperlinks. Todos os recursos têm um interface uniforme e operações bem definidas.
REST foi desenhado para suportar escalabilidade e flexibilidade.
RESTRecursos são tipicamente models e cada um tem um controller com 7 actions: create, new, sho, update, edit, destroy
Existem 4 tipos de operações: Create, Read, Update e Delete (CRUD)
As 4 operações correspondem aos verbos HTTP: GET, POST, PUT, DELETE
Podemos gerar as rotas usando map.resources :nomedomodeloplural
Routes RESTmap.resources :articles
AJAX - Links e forms<%= link_to_remote "Destroy (AJAX)", :url => workshop_path(workshop), :confirm => "Are you sure?", :method => :delete %>
<%= link_to_function "Create new?", "$('newuser').toggle().highlight();" %>
<%= link_to_function "Create new?" do |page| page['new_user'].show page['select_user'].hide page['new_user'].highlightend %>
<% form_remote_tag :url => {:action => 'update'} do %><%= hidden_field_tag "prompt[id]", @prompt.id %><%= render :partial => 'form', :locals => {:mode => 'edit'} %><%= submit_tag "Edit" %>
<% end %>
RJS
RJS é uma API em Ruby para gerar código javascript que é enviado de volta ao browser e executado.
É especialmente útil para actualizar várias partes da página.
RJS - Exemplospage.insert_html :bottom ‘todo_list’, “<li>#{todo.name}</li>”
page.replace_html ‘flash_notice’, “Todo added: #{todo_name}”
page.replace ‘flash_notice’, :partial => ‘flash’, :object => todo
page[:flash_notice].remove|show|hide|toggle # page[:flash_notice] <=> $(‘flash_notice’)
page.alert “The form contains the following errors: #{errors.join(“, “)}”
page << “alert(‘Hello there’)” # Append raw JavaScript to be executed
page.visual_effect :pulsate, ‘flash_notice’
page.delay(3) do
page.visual_effect :fade, ‘flash_notice’
end
TestesTestes Unitários e funcionais
RSPEC
http://rspec.info/
Shoulda
http://thoughtbot.com/projects/shoulda/
Saber mais:
http://blog.jayfields.com/
Internacionalização
Introduzida na versão 2.2 do Ruby on Rails
Traduz datas, numeração, strings, etc
Referências:
http://rails-i18n.org/
http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale
ConclusõesCriámos uma aplicação web para gerir workshops e inscrições
Conseguimos mapear tabelas para objectos sem trabalho manual e aborrecido.
Não precisámos recompilar ou reiniciar a aplicação após cada mudança no código.
Não precisámos configurar dezenas de arquivos XML. Só foi preciso inserir o nome/password da base de dados.
Não precisámos de javascript para escrever AJAX.
Usámos Ruby nas três camadas da aplicação.
Ganhamos uma API de borla. :)
Temos uma estrutura de testes unitários e funcionais.
Performance
Performance
Ver mais:
http://reinventar.com/2008/09/performance-on-rails-barcamp-pt-08/
http://railslab.newrelic.com/
Ferramentas de profiling
www.fiveruns.com
Deployment
Várias opções
Apache + Passenger
Nginx + Mongrel
Lighttpd
FastCGI
Outras
Outras ferramentas
CAPISTRANO
Ferramenta para automatizar operações nos servidores de produção
Documentação em: www.capify.org
Instalação: gem install capistrano
Ver tarefas: cap -T
Exemplo deploy
Exemplo de Receitas
Receita Capistrano para deploy em Passenger:
http://reinventar.com/2008/09/setting-up-git-and-passenger-with-capistrano/
O Futuro
Novidades
Fusão entre Rails e MERB
Novas funcionalidades
Aposta na performance
Conferências e a comunidade
RUPY
RubyConf
RailsConf
Euruko
Scottland on Rails
Rails Summit Latin America
Conferencia Rails (Espanha)
Paris on Rails
LivrosThe Rails Way - Obie Fernandez
Programming Ruby - Dave Thomas Chad Fowler Andy Hunt
Ruby Pocket Reference - Michael Fitzgerald
VídeosRailsCasts
PeepCode
Pragmatic Videos
Rails Envy
E muitos mais...
Exemplos Open-SourceTracks - Gestão de tarefas
Insonshi - Rede Social
Beast - Forum
Typo - Blog
RadiantCMS - Gestor de Conteúdo
Websites
www.ruby-pt.org
www.rubyonrails.org
www.ruby-lang.org
Perguntas?
ObrigadoEmanuel Mota www.ruby-pt.org - [email protected]
Pedro Sousa www.thinkorange.pt - [email protected]