Este talk propõe mostrar para você como construir um app Rails (não SPA) com uma estrutura organizada de Javascript. Você terá oportunidade de ver conceitos como injeção de dependência, single point entry, dispatcher, promises, IIFE, templates JS, Named Routes JS e muito mais? tudo isso aplicado na prática (e tudo junto). Chega de produzir brown fileds! Faça você também a coisa certa.
1. Rails & Javascript
Faça isso direito!
Dicas de como organizar o
javascript em apps Rails não SPA
2. $ 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.
3. • 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
50. // 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();
51. // 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();
52. // 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();
74. class PostSerializer < ActiveModel::Serializer
attributes :title, :body
has_many :comments
end
class CommentSerializer < ActiveModel::Serializer
attributes :name, :body
belongs_to :post
end
75. [
{
"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!"
}
]
}
]
77. 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
✔
✘
88. (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>
89. (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
90. (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
91. (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
92. (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
93. (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
105. (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
}())
106. (function () {
foo = "this should be a private content";
}())
Falta do "var" fará de "foo" global
Falta do “use strict" fará não gerar erro
107. (function () {
foo = "this should be a private content";
}())
"use strict";
ReferenceError: Can’t find variable foo
108. (function () {
foo = "this should be a private content";
}())
"use strict";
var foo = "this should be a private content";