SlideShare uma empresa Scribd logo
1 de 111
Baixar para ler offline
Rails & Javascript
Faça isso direito!
Dicas de como organizar o
javascript em apps Rails não SPA
$ whoami
• Cezinha Anjos.
• Comecei programando num
Apple II e gravando
programas em fitas cassetes
há 26 anos atrás.
• Atualmente focado em Ruby
on Rails e Javascript.
• Gosto de OO, Clean Code,
Design Patterns, BDD e Lean.
• Diretor da ASSEINFO.
• Estamos localizados em Tijucas - SC
- 40 km de Florianópolis.
• Somos em torno de 20 pessoas.
• Quase nenhuma verticalização
hierárquica. Quem tem chefe é índio!
• Desde 2001 no mercado de
automação comercial.
• Trabalhamos com ERP.
• Foco em qualidade.
• Já nascemos agile, mesmo antes de
conhecer o manifesto ágil.
3
História desta palestra
História desta palestra
Hands on de 9 horas
História desta palestra
Hands on de 9 horas
Talk de 50 minutos
Qual o formato da
palestra?
Dicas
Partiremos de um app
tradicional Rails
Evoluindo o código
usando cada dica
Use o Gemfile somente
para dependências do
backend
01
(sempre que possível)
# Arquivo: Gemfile
source 'https://rubygems.org'
 
gem 'rails', '4.2.0'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
Remover gems do front-end
Use o Bower para as
dependências do
front-end
02
$ npm install -g bower
Instalação
Configuração
$ bower init
# enter, enter, enter, enter…
# até que o arquivo bower.json
# seja gerado
Configuração
// Arquivo: bower.json
{
name: ‘rails-and-js’,
version: '0.0.0',
authors: [
'Cezinha <cesar@asseinfo.com.br>'
],
license: 'MIT',
ignore: [
'**/.*',
'node_modules',
'bower_components',
'test',
'tests'
]
}
Configuração
$ vim .bowerrc
{
"directory": "vendor/assets/bower"
}
Caminho onde os
pacotes serão baixados
e a asset pipeline
poderá utilizar.
Instalando dependências
$ bower install jquery#2.0.3 —-save
$ bower install jquery-ujs#1.0.3 --save
# Arquivo: Gemfile
...
gem 'jquery-rails'
Instalando dependências
// arquivo: bower.json
 
{
"name": "rails-and-js",
"version": "0.0.0",
"authors": [
"Cezinha <cesar@asseinfo.com.br>"
],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"jquery": "2.0.3",
"jquery-ujs": "1.0.3"
}
}
Ajustando o manifesto
// arquivo: application.js
 
//= require jquery
//= require_tree .
//= require jquery_ujs//= require jquery-ujs
Você pode instalar
coisas como:
• JQuery;
• JQuery UI;
• Twitter Bootstrap;
• Font Awesome;
• Angular JS;
• Backbone;
• React JS;
Qualquer projeto
que
esteja
no
github
(ou
sim
ilar)
Crie uma pasta para cada
view e pelo menos um
arquivo para cada action
03
$ mkdir app/assets/javascripts/views
$ mkdir app/assets/javascripts/views/people
Uma pasta por view
Pelo menos um
arquivo por action
A separação dos scripts
ajudará nas futuras
manutenções
Aceite que todos os seus
javascripts acabarão em
um único arquivo
04
(nem sempre isso é verdade ;-)
Visão do programador
4 arquivos separados
// arquivo: app/assets/javascripts/views/people/index.js
 
alert("Running index.js");
// arquivo: app/assets/javascripts/views/people/edit.js
 
alert("Running edit.js");
// arquivo: app/assets/javascripts/views/people/show.js
 
alert("Running show.js");
// arquivo: app/assets/javascripts/views/people/new.js
 
alert("Running new.js");
http://localhost:3000/
people/new
http://localhost:3000/
people/new
1
2
3
4
http://localhost:3000/
people/new
1
2
3
4
W
TF?!
// arquivo: application.js
// na visão do sprockets
// sem "uglificação"
 
alert("Running edit.js");
alert("Running index.js");
alert("Running new.js");
alert("Running show.js");
Visão do sprockets
Você não tem como separar fisicamente
os scripts sem aumentar o número de
requisições.
Minha opinião: não separe!
O segredo é
modularizar
05
http://larsjung.de/modulejs/
Instalação
$ bower install modulejs#1.5.0 --save
Ajustando o manifesto
// arquivo: application.js
 
//= require jquery
//= require jquery-ujs
//= require_tree .//= require modulejs
//= require_tree .
alert("Running index.js");
// arquivo: app/assets/javascripts/views/people/index.js
modulejs.define("people.index", function() {
return function() { alert("Running index.js”); };
});
// Resultado do console:
function () { alert("Running index.js"); }
1
2 3
4
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
Estabeleça um Single
Entry Point
06
Defina um único ponto
para início de
execução de todo o
seu javascript.
O fluxo de execução
tende a ficar mais
claro.
Carregamento
da página
Executa JS de
terceiros
Dispatcher
(boot.js)
people/index.js
foo.js
people/new.js people/edit.js people/show.js
bar.js
x.js y.js
Fluxo de
execução
Carregamento
da página
Executa JS de
terceiros
Dispatcher
(boot.js)
people/index.js
foo.js
people/new.js people/edit.js people/show.js
bar.js
x.js y.js
Fluxo de
execução
Carregamento
da página
Executa JS de
terceiros
Dispatcher
(boot.js)
people/index.js
foo.js
people/new.js people/edit.js people/show.js
bar.js
x.js y.js
Fluxo de
execução
Carregamento
da página
Executa JS de
terceiros
Dispatcher
(boot.js)
people/index.js
foo.js
people/new.js people/edit.js people/show.js
bar.js
x.js y.js
Fluxo de
execução
Carregamento
da página
Executa JS de
terceiros
Dispatcher
(boot.js)
people/index.js
foo.js
people/new.js people/edit.js people/show.js
bar.js
x.js y.js
Fluxo de
execução
Carregamento
da página
Executa JS de
terceiros
Dispatcher
(boot.js)
people/index.js
foo.js
people/new.js people/edit.js people/show.js
bar.js
x.js y.js
Fluxo de
execução
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
// Aqui deve ser o seu primeiro
// ponto de execução de javascript
});
})()
Ajustando o manifesto
// arquivo: application.js
 
//= require jquery
//= require jquery-ujs
//= require modulejs
//= require_tree .
//= require boot
//= require_tree ./views
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
});
})()
// Aqui deve ser o seu primeiro
// ponto de execução de javascript
//
modulejs.define("people.index", function() {
return function() { alert("Running index.js") };
});
// arquivo: app/assets/javascripts/views/people/index.js
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
});
})()
// Aqui deve ser o seu primeiro
// ponto de execução de javascript
//
modulejs.define("people.index", function() {
return function() { alert("Running index.js") };
});
// arquivo: app/assets/javascripts/views/people/index.js
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
});
})()
// Aqui deve ser o seu primeiro
// ponto de execução de javascript
//
modulejs.define("people.index", function() {
return function() { alert("Running index.js") };
});
// arquivo: app/assets/javascripts/views/people/index.js
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
Use o Dispatcher para
executar o JS de cada
view
07
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
});
})()
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
});
})()
A action está hard coded neste ponto!
Desafio: como sinalizar
para o JS qual a action
que estamos executando?
Através do HTML gerado
pelo servidor.
<body dispatcher="people.index">
<body dispatcher="people.index">
<!-- arquivo:
app/views/layouts/application.html.erb
-->
 
<body <%= dispatcher_tag %>>
<body dispatcher="people.index">
<!-- arquivo:
app/views/layouts/application.html.erb
-->
 
<body <%= dispatcher_tag %>>
Criaremos um helper para “batizar" a tag body
<body dispatcher="people.index">
# arquivo: app/helpers/application_helper.rb
 
module ApplicationHelper
def dispatcher_tag
controller_name = controller.class.name.underscore
controller_name.gsub!(///, "_")
controller_name.gsub!(/_controller$/, "")
 
div_tag = %(dispatcher="#{controller_name}.#{controller.action_name}")
 
div_tag.html_safe
end
end
<body dispatcher="people.index">
# arquivo: app/helpers/application_helper.rb
 
module ApplicationHelper
def dispatcher_tag
controller_name = controller.class.name.underscore
controller_name.gsub!(///, "_")
controller_name.gsub!(/_controller$/, "")
 
div_tag = %(dispatcher="#{controller_name}.#{controller.action_name}")
 
div_tag.html_safe
end
end
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
});
})()
A action está hard coded neste ponto!
<body dispatcher="people.index">
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
});
})()
<body dispatcher="people.index">
var dispatch_to = $("body").attr("dispatcher");
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require("people.index");
console.log(mymodule);
mymodule();
});
})()
<body dispatcher="people.index">
var dispatch_to = $("body").attr("dispatcher");
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require(dispatch_to);
console.log(mymodule);
mymodule();
});
})()
<body dispatcher="people.index">
var dispatch_to = $("body").attr("dispatcher");
// arquivo app/assets/javascripts/boot.js
 
(function() {
"use strict";
 
$(document).ready(function() {
var mymodule = modulejs.require(dispatch_to);
console.log(mymodule);
mymodule();
});
})()
<body dispatcher="people.index">
var dispatch_to = $("body").attr("dispatcher");
Faça seus controllers
responderem JSON
08
# arquivo: app/controllers/people_controller.rb
 
...
def index
@people = Person.all
 
respond_to do |format|
format.html
format.json { render json: @people.to_json }
end
end
...
respond_with foi removido
do Rails na versão 4.2.
IMHO respond_to deixa
mais claro a intenção do
programador.
ActiveModel::Serializers
Existe coisa melhor do
que to_json
09
class PostSerializer < ActiveModel::Serializer
attributes :title, :body
has_many :comments
end
class CommentSerializer < ActiveModel::Serializer
attributes :name, :body
belongs_to :post
end
[
{
"title":"Obama mentiu sobre operação que matou Bin Laden",
"body":"O jornalista Seymour Hersh, que recebeu o Prêmio Pulitzer…”,
"comments":
[
{
"name":"Fulano",
"body":"Eu não acredito!"
}
]
}
]
js-routes: Named
Routes do Rails no JS
10
Rails.application.routes.draw do
resources :people
end
people GET /people(.:format) people#index
new_person GET /people/new(.:format) people#new
edit_person GET /people/:id/edit(.:format) people#edit
person GET /people/:id(.:format) people#show
$ bin/rake routes
✔
✘
# Arquivo: Gemfile
source 'https://rubygems.org'
 
gem 'rails', '4.2.0'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0’
gem 'jquery-rails'
gem 'js-routes'
//= require_tree ./views
//= require boot
//= require js-routes
//= require_tree ./views
//= require boot
Ajustando o manifesto
// arquivo: application.js
 
//= require jquery
//= require jquery-ujs
//= require modulejs
Routes.people_path()
"/people.json"
 
Routes.new_person_path()
"/people/new.json"
 
Routes.edit_person_path(1)
"/people/1/edit.json"
 
Routes.person_path(1)
"/people/1.json"
var promise;
 
promise = $.get("/people.json");
✘
promise = $.get(Routes.people_path());
✔
ejs: fazendo o sprockets
servir templates
11
# Arquivo: Gemfile
source 'https://rubygems.org'
 
gem 'rails', '4.2.0'
gem 'sqlite3'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0’
gem 'jquery-rails'
gem 'js-routes'
gem 'ejs'
Ajustando o manifesto
//= require_tree ./views
//= require boot
//= require_tree ./templates
//= require_tree ./views
//= require boot
// arquivo: application.js
 
//= require jquery
//= require jquery-ujs
//= require modulejs
//= require js-routes
<!-- arquivo:
app/assets/javascripts/templates/people/example.jst.ejs
-->
 
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
Criando um template
(function() {
"use strict"
var html = JST["templates/people/example"]({
name: "The name",
phone: "(48) 1234-5678"
});
$("div#person").html(html);
}())
Consumindo um template
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
(function() {
"use strict"
var html = JST["templates/people/example"]({
name: "The name",
phone: "(48) 1234-5678"
});
$("div#person").html(html);
}())
Consumindo um template
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
Array de
templates
compilados
(function() {
"use strict"
var html = JST["templates/people/example"]({
name: "The name",
phone: "(48) 1234-5678"
});
$("div#person").html(html);
}())
Consumindo um template
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
A chave do array
é o path do
template
(function() {
"use strict"
var html = JST["templates/people/example"]({
name: "The name",
phone: "(48) 1234-5678"
});
$("div#person").html(html);
}())
Consumindo um template
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
O conteúdo do
array é uma função
(function() {
"use strict"
var html = JST["templates/people/example"]({
name: "The name",
phone: "(48) 1234-5678"
});
$("div#person").html(html);
}())
Consumindo um template
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
Objeto literal com
parâmetros do
template
(function() {
"use strict"
var html = JST["templates/people/example"]({
name: "The name",
phone: "(48) 1234-5678"
});
$("div#person").html(html);
}())
Consumindo um template
<p>Name:</p>
<p><%= name %></p>
 
<p>Phone:</p>
<p><%= phone %></p>
Use o html resul-
tante como quiser
Crie escopos com IIFE
12
IIFE
Immediately-invoked
function expression
(expressão de função invocada
imediatamente)
IIFE pode ser usada para
isolar escopos
 
(function() {
}())
Immediately-invoked function expression
 
(function() {
}())
Expressão
Immediately-invoked function expression
 
(function() {
}())
Função
Immediately-invoked function expression
 
(function() {
}())
Execução imediata
Immediately-invoked function expression
var foo = "value outside IIFE";
 
(function() {
var foo = "value inside IIFE";
console.log(foo);
}())
 
console.log(foo);
// Resultado:
// value inside IIFE
// value outside IIFE
Lembre-se que todos os
seus javascripts acabarão
em um único arquivo.
Sem escopos os
resultados da "uglificação"
são imprevisíveis.
Na boa… “use strict"
13
(function () {
"use strict";
// Introduzido no ECMA 5.
// Converte enganos em erros.
// Simplifica o uso de variáveis.
// Simplifica "eval" e argumentos.
// Ajuda a escrever JS mais seguro.
//
// Referência: Mozilla Developer Network
}())
(function () {
foo = "this should be a private content";
}())
Falta do "var" fará de "foo" global
Falta do “use strict" fará não gerar erro
(function () {
foo = "this should be a private content";
}())
"use strict";
ReferenceError: Can’t find variable foo
(function () {
foo = "this should be a private content";
}())
"use strict";
var foo = "this should be a private content";
Fuja do callback hell
use promises
14
var promise;
 
promise = $.get("/people.json");
 
promise.done(function(data) {
alert("done");
alert(JSON.stringify(data));
});
 
promise.fail(function(error) {
alert("fail");
alert("status text:" + error.statusText);
});
 
promise.always(function() {
alert("always");
});
So long, and thanks for all
the fish!
@cezinha_anjos
cezinha.info
asseinfo.com.br
111

Mais conteúdo relacionado

Mais procurados

Jquery - Dicas e Truques
Jquery - Dicas e TruquesJquery - Dicas e Truques
Jquery - Dicas e TruquesLambda 3
 
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)Juliana Chahoud
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidNelson Glauber Leal
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Rafael Ponte
 
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftSemcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftJuliana Chahoud
 
Design Patterns on Rails
Design Patterns on RailsDesign Patterns on Rails
Design Patterns on Railstchandy
 
Apple Watch - Digital Day da CI&T
Apple Watch - Digital Day da CI&TApple Watch - Digital Day da CI&T
Apple Watch - Digital Day da CI&TJuliana Chahoud
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideSergio Azevedo
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
Apresentando o Yii Framework
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Frameworkangellicacardozo
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitFlávio Lisboa
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFRafael Ponte
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 

Mais procurados (20)

Jquery - Dicas e Truques
Jquery - Dicas e TruquesJquery - Dicas e Truques
Jquery - Dicas e Truques
 
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
Swift, a nova linguagem de programação da Apple (CocoaHeads Sao Paulo)
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos Android
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)
 
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftSemcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
 
Design Patterns on Rails
Design Patterns on RailsDesign Patterns on Rails
Design Patterns on Rails
 
Apple Watch - Digital Day da CI&T
Apple Watch - Digital Day da CI&TApple Watch - Digital Day da CI&T
Apple Watch - Digital Day da CI&T
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-Side
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Apresentando o Yii Framework
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Framework
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo Toolkit
 
jQuery
jQueryjQuery
jQuery
 
Grails
GrailsGrails
Grails
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSF
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Python 06
Python 06Python 06
Python 06
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Spring boot
Spring bootSpring boot
Spring boot
 

Semelhante a TDC 2015 - Rails & Javascript: faça isso direito

Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Python e Django
Python e DjangoPython e Django
Python e Djangopugpe
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLtarginosilveira
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...WeOp - The Operations Summit
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Desmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest FrameworkDesmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest FrameworkBruno Oliveira
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorAllyson Barros
 
Ruby on Rails - Filosofia e Prática
Ruby on Rails - Filosofia e PráticaRuby on Rails - Filosofia e Prática
Ruby on Rails - Filosofia e PráticaGabriel Molter
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 

Semelhante a TDC 2015 - Rails & Javascript: faça isso direito (20)

Palestra
PalestraPalestra
Palestra
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Python e Django
Python e DjangoPython e Django
Python e Django
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Desmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest FrameworkDesmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest Framework
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
 
Ruby on Rails - Filosofia e Prática
Ruby on Rails - Filosofia e PráticaRuby on Rails - Filosofia e Prática
Ruby on Rails - Filosofia e Prática
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 

TDC 2015 - Rails & Javascript: faça isso direito