SlideShare uma empresa Scribd logo
Globalcode	
  –	
  Open4education
Interfaces ricas com Rails e React.JS
Rodrigo Urubatan
@urubatan
Globalcode	
  –	
  Open4education
Quem?
Programador desde 1997
Trabalha com Ruby na Brightwire
Escreveu "Ruby On Rails: Desenvolvimento fácil e Rápido de
aplicações web”
Já trabalhou com diversas linguagens (C, C++, Delphi, PHP,
ASP, ColdFusion, VisualBasic, C#, Python, Ruby, Assembly,
…)
Apaixonado por Agile e atualmente por trabalho remoto
Patinador, Corredor, Ciclista e agora resolveu aprender
Karate :D
Pai de um Guri de 6 anos
http://urubatan.com.br - Anda meio abandonado mas vai voltar
http://sobrecodigo.com - idem
Globalcode	
  –	
  Open4education
Objetivo
Usar o Rails como backend da aplicação
Toda a interação com o usuário será implementada
no cliente
Validações e regras de negócio serão
implementadas no servidor
(sim, eu poderia usar Sinatra mas sou preguiçoso)
Globalcode	
  –	
  Open4education
Cuidado!
Nesta palestra vamos falar de uma SPA (Single
Page Application)
Isto tem vantagens e desvantagens
Melhora muito a interação com o usuário sem
duplicação de código, já que o código de
renderização fica todo no JS
Piora muito a indexação da sua aplicação por
buscadores (adeus SEO - ou não…)
Globalcode	
  –	
  Open4education
Criando a aplicação
Uma aplicação padrão Rails (rails new …)
Gemfile updates
gem 'backbone-on-rails'
gem 'react-rails', github: 'reactjs/react-rails', ref:
'master'
Environment update (development.rb para
começar)
config.react.variant = :development

config.react.addons = true # defaults to false

config.react.server_renderer =
React::ServerRendering::SprocketsRenderer
bundle install
rails g react:install
Globalcode	
  –	
  Open4education
Componentes
Componentes javascript vão ficar em app/assets/
javascript/components
Backbone.js vai facilitar a comunicação cliente/
servidor
arquivos .js.jsx tem uma facilidade extra, são
compilados pelo react-rails via asset pipeline e
permitem adicionar HTML inline
Globalcode	
  –	
  Open4education
Cadastrando um Usuário
rails g scaffold user name:string password:string
email:string
Apagar todas as views do usuário exceto
index.html.erb
Globalcode	
  –	
  Open4education
Alterações no controller
Fazer todos os métodos retornarem json
Remover edit, new e show
Apagar todo o código de index.html.erb e mudar
para:

<%= react_component('Layout', {}, {prerender:
false}) %>
Globalcode	
  –	
  Open4education
Agora mãos a obra
já temos uma “API" em Rails, poderíamos ter o
código em Sinatra que seria mais leve, mas eu
gosto do asset pipeline e assim fica mais fácil para
um iniciante
Falta criar os componentes backbone para acessar
o backend
Criar os componentes react para a UI
Globalcode	
  –	
  Open4education
backbone.js
app/assets/javascripts/collections/users.js
var Users = Backbone.Collection.extend({

model: User,

url: '/users'

});
app/assets/jaascripts/models/user.js

var User = Backbone.Model.extend({



});
Globalcode	
  –	
  Open4education
layout.js.jsx
var Layout = React.createClass({

getInitialState: function(){

var users = null;

if (this.props.collection) {

users = new Users(this.props.collection);

} else {

users = new Users();

users.fetch({success:function(data){

this.forceUpdate();

}.bind(this)});

}

return {

collection: users,

model: new User()

};

},

editModel:function(model){

this.setState({

model: model

})

},

newModel:function(){

this.setState({

model: new User()

})

},

render: function () {

return (<div>

<div id="list">

<UserList collection={this.state.collection} editModel={this.editModel}/>

</div>

<div id="form">

<UserForm collection={this.state.collection} model={this.state.model}/>

<a onClick={this.newModel}>New User</a>

</div>

</div>);

}

});
Globalcode	
  –	
  Open4education
user_list.js.jsx
var UserList = React.createClass({

componentDidMount: function () {

this.props.collection.on("change", function () {

this.forceUpdate()

}, this);

this.props.collection.on("reset", function () {

this.forceUpdate()

}, this);

},

componentWillUnmount: function () {

this.props.collection.off(null, null, this);

},

render: function () {

var users = this.props.collection.map(function (model) {

var editModel = function () {

this.props.editModel(model);

};

return (

<tr key={model.get("id")}>

<td><a href=“#” onClick={editModel.bind(this)}>{model.get("name")}</a></td>

<td>{model.get("email")}</td>

<td><a href=“#” onClick={model.destroy}>X</a></td>

</tr>

);

}.bind(this));

return (

<table className="user-list">

<thead>

<tr>

<th>Name</th>

<th>Email</th>

<th>&nbsp;</th>

</tr>

</thead>

<tbody>

{users}

</tbody>

</table>

);

}

});
Globalcode	
  –	
  Open4education
user_form.js.jsx
var UserForm = React.createClass({

submitUser: function () {

if(!this.props.model.get("id")){

this.props.collection.create(this.props.model)

}else{

this.props.model.save();

}

},

render: function () {

var label = this.props.model.get("id") ? "Update" : "Create";

return (

<div className="user-form">

<InputWithLabel model={this.props.model} label="Name" name="name" type="text"/>

<InputWithLabel model={this.props.model} label="Email" name="email" type="text"/>

<InputWithLabel model={this.props.model} label="Password" name="password" type="password"/>

<div className="form-field">

<button onClick={this.submitUser}>{label}</button>

</div>

</div>

);

}

});
Globalcode	
  –	
  Open4education
input_with_label.js.jsx
var InputWithLabel = React.createClass({

handleChange: function(event) {

this.props.model.set(this.props.name,event.target.value)

},

render: function() {

return <div className="form-field">

<label htmlFor={this.props.name}>{this.props.label}</label>

<div>

<input id={this.props.name} type={this.props.type} name={this.props.name} ref="input" onChange={this.handleChange}
value={this.props.model.get(this.props.name)}/>

</div>

</div>;

}

});
Globalcode	
  –	
  Open4education
O que, quando, onde e por
que?
Muitas aplicações hoje em dia exigem um nível alto
de interação com o usuário
Implementar isto usando bibliotecas mais baixo
nível é muito fácil de causar uma grande
confusão do código (PHP alguem?)
Componentização evita duplicação de código e
facilita a organização
Globalcode	
  –	
  Open4education
Globalcode	
  –	
  Open4education
indexação? performance?
renderização no servidor:

<%= react_component('Layout', {collection:
@users}, {prerender: true}) %>
components.js

//= require underscore

//= require backbone

//= require_tree ./models

//= require_tree ./collections

//= require_tree ./components

Globalcode	
  –	
  Open4education
Mas é só isto?
React-router
Backbone.Router
Flux - arquitetura JS usada pelo Facebook
Globalcode	
  –	
  Open4education

Mais conteúdo relacionado

PDF
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
PDF
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
PDF
Vraptor 3
PDF
React Native na globo.com
PPTX
Write once, run "everywhere"
ODP
Grails: O Java em Alta Produtividade
PDF
Curso de ReactJS
PPTX
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Vraptor 3
React Native na globo.com
Write once, run "everywhere"
Grails: O Java em Alta Produtividade
Curso de ReactJS
Minicurso - Desenvolvendo aplicações web com JavaScript e AngularJS - Estácio...

Mais procurados (20)

PPTX
Primeiros passos no Vue.js
PDF
JSF 2.0 e ScrumToys
PDF
Blazor #SnetTalks3
PDF
Desenvolvimento web ágil e descomplicado usando ruby on rails
PDF
Java Web Fácil com VRaptor
PPTX
Chega de lendas! JavaFX em Android
PDF
Google Web Toolkit
PPTX
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
PPTX
Desenvolvendo APPs Com Angular.JS + Cordova
PDF
React - Biblioteca Javascript para criação de UI
PPTX
A Evolução do Front end
PPTX
Workshop react + adonis.js
PPT
Rapida apresentacao sobre o Grails
PDF
Introdução ao java fx e visage
PPTX
Workshop - Ionic + firebase
PPTX
Grails
PPTX
Introdução Vue JS
PPT
Google Web Toolkit
PPTX
Apresentação angular js
Primeiros passos no Vue.js
JSF 2.0 e ScrumToys
Blazor #SnetTalks3
Desenvolvimento web ágil e descomplicado usando ruby on rails
Java Web Fácil com VRaptor
Chega de lendas! JavaFX em Android
Google Web Toolkit
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Desenvolvendo APPs Com Angular.JS + Cordova
React - Biblioteca Javascript para criação de UI
A Evolução do Front end
Workshop react + adonis.js
Rapida apresentacao sobre o Grails
Introdução ao java fx e visage
Workshop - Ionic + firebase
Grails
Introdução Vue JS
Google Web Toolkit
Apresentação angular js
Anúncio

Semelhante a TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS (20)

PDF
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
PDF
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
PDF
Rails API com GraphQL
PPTX
PDF
TDC 2015 - Rails & Javascript: faça isso direito
PDF
Aula ASP.NET.pdf whatsap Whatsap pdf.com
PPS
Lampada Php Conference Brasil 2007 Palestra
ODP
Mini-curso RubyOnRails CESOL
PPTX
ASP.NET vNext no .NET Architects Days 2014
PDF
Workshop Ruby on Rails dia 2 ruby-pt
PDF
REST vs GraphQL - A batalha das APIs.pdf
PDF
REST vs GraphQL - A batalha das APIs.pdf
PDF
React nos Trilhos
PDF
Aplicações com Tecnologias Web
PPTX
Oficina Sesc Android - V1
PDF
JSF2 c/ PrimeFaces, RichFaces e ICEfaces
PDF
JSF 2.0 e ScrumToys
PPT
Led Lua Workshop
PDF
GDG ABC Meetup #5 - Tendências 2015
PDF
Apresentação CEJS - Do nada para a nuvem
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
Rails API com GraphQL
TDC 2015 - Rails & Javascript: faça isso direito
Aula ASP.NET.pdf whatsap Whatsap pdf.com
Lampada Php Conference Brasil 2007 Palestra
Mini-curso RubyOnRails CESOL
ASP.NET vNext no .NET Architects Days 2014
Workshop Ruby on Rails dia 2 ruby-pt
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdf
React nos Trilhos
Aplicações com Tecnologias Web
Oficina Sesc Android - V1
JSF2 c/ PrimeFaces, RichFaces e ICEfaces
JSF 2.0 e ScrumToys
Led Lua Workshop
GDG ABC Meetup #5 - Tendências 2015
Apresentação CEJS - Do nada para a nuvem
Anúncio

Mais de Rodrigo Urubatan (20)

PPTX
Ruby code smells
PPTX
Data science in ruby is it possible? is it fast? should we use it?
PDF
Data science in ruby, is it possible? is it fast? should we use it?
PPTX
2018 the conf put git to work - increase the quality of your rails project...
PPTX
2018 RubyHACK: put git to work - increase the quality of your rails project...
PDF
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
PDF
Your first game with unity3d framework
PDF
Tdc Floripa 2017 - 8 falácias da programação distribuída
PPTX
Rubyconf2016 - Solving communication problems in distributed teams with BDD
PDF
resolvendo problemas de comunicação em equipes distribuídas com bdd
PDF
vantagens e desvantagens de trabalhar remoto
PDF
Using BDD to Solve communication problems
PDF
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
PDF
Ruby para programadores java
PPTX
Treinamento html5, css e java script apresentado na HP
PPTX
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
PPTX
Mini curso rails 3
PPT
Aplicações Hibridas com Phonegap e HTML5
PPTX
Git presentation to some coworkers some time ago
PDF
Intrudução ao Behavior Driven Development (BDD) com Ruby on Rails
Ruby code smells
Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?
2018 the conf put git to work - increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
Your first game with unity3d framework
Tdc Floripa 2017 - 8 falácias da programação distribuída
Rubyconf2016 - Solving communication problems in distributed teams with BDD
resolvendo problemas de comunicação em equipes distribuídas com bdd
vantagens e desvantagens de trabalhar remoto
Using BDD to Solve communication problems
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Ruby para programadores java
Treinamento html5, css e java script apresentado na HP
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Mini curso rails 3
Aplicações Hibridas com Phonegap e HTML5
Git presentation to some coworkers some time ago
Intrudução ao Behavior Driven Development (BDD) com Ruby on Rails

Último (20)

PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
Émile Durkheim slide elaborado muito bom
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Aula sobre banco de dados com firebase db
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
Aula sobre desenvolvimento de aplicativos
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Émile Durkheim slide elaborado muito bom
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula sobre banco de dados com firebase db
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Curso de Java 9 - (Threads) Multitarefas.pptx
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Aula sobre desenvolvimento de aplicativos
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Apple Pippin Uma breve introdução. - David Glotz
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx

TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS

  • 1. Globalcode  –  Open4education Interfaces ricas com Rails e React.JS Rodrigo Urubatan @urubatan
  • 2. Globalcode  –  Open4education Quem? Programador desde 1997 Trabalha com Ruby na Brightwire Escreveu "Ruby On Rails: Desenvolvimento fácil e Rápido de aplicações web” Já trabalhou com diversas linguagens (C, C++, Delphi, PHP, ASP, ColdFusion, VisualBasic, C#, Python, Ruby, Assembly, …) Apaixonado por Agile e atualmente por trabalho remoto Patinador, Corredor, Ciclista e agora resolveu aprender Karate :D Pai de um Guri de 6 anos http://urubatan.com.br - Anda meio abandonado mas vai voltar http://sobrecodigo.com - idem
  • 3. Globalcode  –  Open4education Objetivo Usar o Rails como backend da aplicação Toda a interação com o usuário será implementada no cliente Validações e regras de negócio serão implementadas no servidor (sim, eu poderia usar Sinatra mas sou preguiçoso)
  • 4. Globalcode  –  Open4education Cuidado! Nesta palestra vamos falar de uma SPA (Single Page Application) Isto tem vantagens e desvantagens Melhora muito a interação com o usuário sem duplicação de código, já que o código de renderização fica todo no JS Piora muito a indexação da sua aplicação por buscadores (adeus SEO - ou não…)
  • 5. Globalcode  –  Open4education Criando a aplicação Uma aplicação padrão Rails (rails new …) Gemfile updates gem 'backbone-on-rails' gem 'react-rails', github: 'reactjs/react-rails', ref: 'master' Environment update (development.rb para começar) config.react.variant = :development
 config.react.addons = true # defaults to false
 config.react.server_renderer = React::ServerRendering::SprocketsRenderer bundle install rails g react:install
  • 6. Globalcode  –  Open4education Componentes Componentes javascript vão ficar em app/assets/ javascript/components Backbone.js vai facilitar a comunicação cliente/ servidor arquivos .js.jsx tem uma facilidade extra, são compilados pelo react-rails via asset pipeline e permitem adicionar HTML inline
  • 7. Globalcode  –  Open4education Cadastrando um Usuário rails g scaffold user name:string password:string email:string Apagar todas as views do usuário exceto index.html.erb
  • 8. Globalcode  –  Open4education Alterações no controller Fazer todos os métodos retornarem json Remover edit, new e show Apagar todo o código de index.html.erb e mudar para:
 <%= react_component('Layout', {}, {prerender: false}) %>
  • 9. Globalcode  –  Open4education Agora mãos a obra já temos uma “API" em Rails, poderíamos ter o código em Sinatra que seria mais leve, mas eu gosto do asset pipeline e assim fica mais fácil para um iniciante Falta criar os componentes backbone para acessar o backend Criar os componentes react para a UI
  • 10. Globalcode  –  Open4education backbone.js app/assets/javascripts/collections/users.js var Users = Backbone.Collection.extend({
 model: User,
 url: '/users'
 }); app/assets/jaascripts/models/user.js
 var User = Backbone.Model.extend({
 
 });
  • 11. Globalcode  –  Open4education layout.js.jsx var Layout = React.createClass({
 getInitialState: function(){
 var users = null;
 if (this.props.collection) {
 users = new Users(this.props.collection);
 } else {
 users = new Users();
 users.fetch({success:function(data){
 this.forceUpdate();
 }.bind(this)});
 }
 return {
 collection: users,
 model: new User()
 };
 },
 editModel:function(model){
 this.setState({
 model: model
 })
 },
 newModel:function(){
 this.setState({
 model: new User()
 })
 },
 render: function () {
 return (<div>
 <div id="list">
 <UserList collection={this.state.collection} editModel={this.editModel}/>
 </div>
 <div id="form">
 <UserForm collection={this.state.collection} model={this.state.model}/>
 <a onClick={this.newModel}>New User</a>
 </div>
 </div>);
 }
 });
  • 12. Globalcode  –  Open4education user_list.js.jsx var UserList = React.createClass({
 componentDidMount: function () {
 this.props.collection.on("change", function () {
 this.forceUpdate()
 }, this);
 this.props.collection.on("reset", function () {
 this.forceUpdate()
 }, this);
 },
 componentWillUnmount: function () {
 this.props.collection.off(null, null, this);
 },
 render: function () {
 var users = this.props.collection.map(function (model) {
 var editModel = function () {
 this.props.editModel(model);
 };
 return (
 <tr key={model.get("id")}>
 <td><a href=“#” onClick={editModel.bind(this)}>{model.get("name")}</a></td>
 <td>{model.get("email")}</td>
 <td><a href=“#” onClick={model.destroy}>X</a></td>
 </tr>
 );
 }.bind(this));
 return (
 <table className="user-list">
 <thead>
 <tr>
 <th>Name</th>
 <th>Email</th>
 <th>&nbsp;</th>
 </tr>
 </thead>
 <tbody>
 {users}
 </tbody>
 </table>
 );
 }
 });
  • 13. Globalcode  –  Open4education user_form.js.jsx var UserForm = React.createClass({
 submitUser: function () {
 if(!this.props.model.get("id")){
 this.props.collection.create(this.props.model)
 }else{
 this.props.model.save();
 }
 },
 render: function () {
 var label = this.props.model.get("id") ? "Update" : "Create";
 return (
 <div className="user-form">
 <InputWithLabel model={this.props.model} label="Name" name="name" type="text"/>
 <InputWithLabel model={this.props.model} label="Email" name="email" type="text"/>
 <InputWithLabel model={this.props.model} label="Password" name="password" type="password"/>
 <div className="form-field">
 <button onClick={this.submitUser}>{label}</button>
 </div>
 </div>
 );
 }
 });
  • 14. Globalcode  –  Open4education input_with_label.js.jsx var InputWithLabel = React.createClass({
 handleChange: function(event) {
 this.props.model.set(this.props.name,event.target.value)
 },
 render: function() {
 return <div className="form-field">
 <label htmlFor={this.props.name}>{this.props.label}</label>
 <div>
 <input id={this.props.name} type={this.props.type} name={this.props.name} ref="input" onChange={this.handleChange} value={this.props.model.get(this.props.name)}/>
 </div>
 </div>;
 }
 });
  • 15. Globalcode  –  Open4education O que, quando, onde e por que? Muitas aplicações hoje em dia exigem um nível alto de interação com o usuário Implementar isto usando bibliotecas mais baixo nível é muito fácil de causar uma grande confusão do código (PHP alguem?) Componentização evita duplicação de código e facilita a organização
  • 17. Globalcode  –  Open4education indexação? performance? renderização no servidor:
 <%= react_component('Layout', {collection: @users}, {prerender: true}) %> components.js
 //= require underscore
 //= require backbone
 //= require_tree ./models
 //= require_tree ./collections
 //= require_tree ./components

  • 18. Globalcode  –  Open4education Mas é só isto? React-router Backbone.Router Flux - arquitetura JS usada pelo Facebook