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
4. 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)
5. 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…)
6. 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
7. 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
8. Globalcode
– Open4education
Cadastrando um Usuário
rails g scaffold post title:string slug:text content:text
Apagar todas as views do post exceto index.html.erb
Apagar todo o código de index.html.erb e mudar para:
<%= react_component('Blog', {collection: @posts, item: @post}) %>
9. Globalcode
– Open4education
Alterações no controller
Fazer todos os métodos retornarem json, mais ou menos assim (não é a melhor
tecnica, mas boa o suficiente para o exemplo)
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]
def index
@posts = Post.all
end
def show
@posts = Post.all
render :index
end
# GET /posts/new
def new
@post = Post.new
render :index
end
# POST /posts
# POST /posts.json
def create
@post = Post.new(post_params)
respond_to do |format|
if @post.save
format.json { render json: @post, status: :created, location: @post }
else
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /posts/1
# PATCH/PUT /posts/1.json
def update
respond_to do |format|
if @post.update(post_params)
format.json { render json: @user, status: :ok, location: @post }
else
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post.destroy
respond_to do |format|
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.find_by(slug: params[:id]) || Post.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def post_params
params.require(:post).permit(:title, :slug, :content)
end
end
10. 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
17. 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
20. Globalcode
– Open4education
Mas é só isto?
React-router
Backbone.Router
Flux - arquitetura JS usada pelo Facebook
Pré processamento com Gulp (sintaxe do ECMAScript 6 suportada)