• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

The Plafatorma Way - Oxente Rails - 05aug2010

on

  • 3,162 views

 

Statistics

Views

Total Views
3,162
Views on SlideShare
1,934
Embed Views
1,228

Actions

Likes
4
Downloads
25
Comments
0

2 Embeds 1,228

http://blog.plataformatec.com.br 749
http://feeds.feedburner.com 479

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />

The Plafatorma Way - Oxente Rails - 05aug2010 The Plafatorma Way - Oxente Rails - 05aug2010 Presentation Transcript

  • the way José Valim blog.plataformatec.com @josevalim
  • the way ID blog twitter José Valim blog.plataformatec.com @josevalim
  • José Valim blog.plataformatec.com @josevalim
  • Consultoria José Valim blog.plataformatec.com @josevalim
  • Coaching em Consultoria Rails e Agile José Valim blog.plataformatec.com @josevalim
  • Desenvolvemos aplicações em Rails Coaching em Consultoria Rails e Agile José Valim blog.plataformatec.com @josevalim
  • Conversa Test Driven com cliente Development Deploy para staging Lançamento Manutenção José Valim blog.plataformatec.com @josevalim
  • Talk with Test Driven Talk with Test Driven Talk with Test Driven the client Development the client Development the client Development Deploy Deploy Deploy to staging to staging to staging Launch Launch Launch Maintenance Maintenance Maintenance Talk with Test Driven Talk with Test Driven Talk with Test Driven the client Development the client Development the client Development Deploy Deploy Deploy to staging to staging to staging Launch Launch Launch Maintenance Maintenance Maintenance Talk with Test Driven Talk with Test Driven Talk with Test Driven the client Development the client Development the client Development Deploy Deploy Deploy to staging to staging to staging Launch Launch Launch Maintenance Maintenance Maintenance José Valim blog.plataformatec.com @josevalim
  • EFICIÊNCIA & QUALIDADE José Valim blog.plataformatec.com @josevalim
  • CAIXA DE FERRAMENTAS José Valim blog.plataformatec.com @josevalim
  • the way Desenvolvendo Aplicações com Rails José Valim blog.plataformatec.com @josevalim
  • the way Desenvolvendo Aplicações com Rails 3 José Valim blog.plataformatec.com @josevalim
  • the way •Devise •SimpleForm •Responders José Valim blog.plataformatec.com @josevalim
  • DEVISE http://github.com/plataformatec/devise José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Configurável José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Configurável ✦ Vários papéis José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Vários papéis José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Não é flexível ✦ Vários papéis José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Não é flexível ✦ Vários papéis ✦ “Opinionated” José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Não é flexível ✦ Vários papéis ✦ “Opinionated” José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Não é flexível ✦ Vários papéis ✦ “Opinionated” José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Não é flexível ✦ Vários papéis ✦ “Opinionated” José Valim blog.plataformatec.com @josevalim
  • SETEMBRO 2009 AUTHLOGIC CLEARANCE ✦ Apenas modelo ✦ Engine (MVC) ✦ Configurável ✦ Não é flexível ✦ Vários papéis ✦ “Opinionated” José Valim blog.plataformatec.com @josevalim
  • AUTH_HELPERS MVC para Authlogic José Valim blog.plataformatec.com @josevalim
  • AUTH_HELPERS MVC para Authlogic José Valim blog.plataformatec.com @josevalim
  • DEVISE José Valim blog.plataformatec.com @josevalim
  • DEVISE class User < ActiveRecord::Base devise :database_authenticatable, :validatable, :recoverable, :rememberable, :remember_for => 2.weeks end José Valim blog.plataformatec.com @josevalim
  • DEVISE class User < ActiveRecord::Base devise :database_authenticatable, :validatable, :recoverable, :rememberable, :remember_for => 2.weeks end Você escolhe o comportamento a ser incluso José Valim blog.plataformatec.com @josevalim
  • DEVISE class User < ActiveRecord::Base devise :database_authenticatable, :validatable, :recoverable, :rememberable, :remember_for => 2.weeks end Várias opções de configuração José Valim blog.plataformatec.com @josevalim
  • DEVISE class User < ActiveRecord::Base devise :database_authenticatable, :validatable, :recoverable, :rememberable, :remember_for => 2.weeks end class Admin < ActiveRecord::Base devise :database_authenticatable, :timeoutable, :lockable end José Valim blog.plataformatec.com @josevalim
  • DEVISE # app/models/user.rb class User < ActiveRecord::Base devise :database_authenticatable, :validatable, :recoverable, :rememberable, :remember_for => 2.weeks end # config/routes.rb devise_for :users # app/controller/application_controller.rb before_filter :authenticate_user! José Valim blog.plataformatec.com @josevalim
  • DEVISE ✦ Autenticação por form, http e token ✦ Registerable ✦ Lockable ✦ Recoverable ✦ Timeoutable ✦ Rememberable ✦ Validatable ✦ Trackable ✦ Confirmable * os items em negrito estavam presentes na primeira versão José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) RAILS 3 APP Middleware Middleware WARDEN Middleware ROUTER Rails Sinatra José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) Requisição RAILS 3 APP Middleware Middleware WARDEN Middleware ROUTER Rails Sinatra José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) Requisição RAILS 3 APP Middleware Middleware WARDEN Cria um proxy env[‘warden’] Middleware ROUTER Rails Sinatra José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) Requisição RAILS 3 APP Middleware Middleware WARDEN Cria um proxy env[‘warden’] Middleware ROUTER authenticate_user! Rails Sinatra José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) Requisição RAILS 3 APP Middleware Middleware WARDEN Cria um proxy env[‘warden’] Middleware ROUTER authenticate_user! Rails Sinatra env[‘warden’].authenticate! José Valim blog.plataformatec.com @josevalim
  • WARDEN (Rack Authentication Framework) Requisição RAILS 3 APP Middleware Middleware WARDEN Cria um proxy env[‘warden’] Middleware ROUTER authenticate_user! Rails Sinatra env[‘warden’].authenticate! env[‘warden’].authenticate! José Valim blog.plataformatec.com @josevalim
  • EM 140 CARACTERES José Valim blog.plataformatec.com @josevalim
  • Devise é uma solução de autenticação Rack- based, flexível e full-stack para Rails com suporte a diversos papéis José Valim blog.plataformatec.com @josevalim
  • WORKFLOW José Valim blog.plataformatec.com @josevalim
  • 1) rails g devise:install Copia um initializer para configurar a sua aplicação e um arquivo de I18n José Valim blog.plataformatec.com @josevalim
  • 2) rails g devise User Cria um modelo, migração e rotas. Nesse ponto, você já pode sign in, sign up e sign out José Valim blog.plataformatec.com @josevalim
  • 3) rails g devise:views Copia as views do engine para aplicação para customização José Valim blog.plataformatec.com @josevalim
  • rails g devise:install rails g devise User rails g devise:views José Valim blog.plataformatec.com @josevalim
  • PLANOS José Valim blog.plataformatec.com @josevalim
  • ✦ Melhorar o suporte para diversos ORMs ✦ Adicionar suporte para OAuth 2.0 José Valim blog.plataformatec.com @josevalim
  • José Valim blog.plataformatec.com @josevalim
  • SIMPLE FORM http://github.com/plataformatec/simple_form José Valim blog.plataformatec.com @josevalim
  • Formulários são uma parte importante da grande maioria das aplicações José Valim blog.plataformatec.com @josevalim
  • José Valim blog.plataformatec.com @josevalim
  • Não lista mensagens no topo José Valim blog.plataformatec.com @josevalim
  • Não lista mensagens no topo Label José Valim blog.plataformatec.com @josevalim
  • Não lista mensagens no topo Label Mensagem de erro José Valim blog.plataformatec.com @josevalim
  • Não lista mensagens no topo Label Dica Mensagem de erro José Valim blog.plataformatec.com @josevalim
  • Não lista mensagens no topo Label Dica Mensagem de erro Obrigatório? José Valim blog.plataformatec.com @josevalim
  • RAILS FORM BUILDER <%= form_for @user do |f| %> ... <div class="email"> <%= f.label :email, "Email Address" %> <% if error = @user.errors[:email].first %> <%= content_tag(:div, error, :class => "error") %> <% end %> <%= f.text_field :email %> <%= content_tag(:div, "Don’t worry.", :class => "hint") %> </div> ... <% end %> José Valim blog.plataformatec.com @josevalim
  • :( José Valim blog.plataformatec.com @josevalim
  • Ok, vamos trapacear! José Valim blog.plataformatec.com @josevalim
  • RAILS FORM BUILDER + HAML - form_for @user do |f| ... .email = f.label :email, "Email Address” - if error = @user.errors[:email].first .error= error = f.text_field :email .hint= "Don’t worry." ... José Valim blog.plataformatec.com @josevalim
  • Melhor, mas... :( José Valim blog.plataformatec.com @josevalim
  • SIMPLE FORM <%= simple_form_for @user do |f| %> ... <%= f.input :email %> ... <% end %> José Valim blog.plataformatec.com @josevalim
  • Ok, ISSO sim é trapacear! José Valim blog.plataformatec.com @josevalim
  • <%= f.input :email %> José Valim blog.plataformatec.com @josevalim
  • Obtém o tipo do campo do banco de dados <%= f.input :email %> José Valim blog.plataformatec.com @josevalim
  • Lida com mensagens Obtém o tipo do de erro por default campo do banco de dados <%= f.input :email %> José Valim blog.plataformatec.com @josevalim
  • Lida com mensagens Obtém o tipo do de erro por default campo do banco de dados <%= f.input :email %> Labels e dicas são obtidos através do I18n José Valim blog.plataformatec.com @josevalim
  • <%= f.input :email, :as => :string, :label => “Email address”, :hint => “Don’t worry” %> José Valim blog.plataformatec.com @josevalim
  • Ok, e quanto ao markup? José Valim blog.plataformatec.com @josevalim
  • SIMPLE FORM SimpleForm.setup do |config| config.components = [ :label, :error, :input, :hint ] config.hint_tag = :span config.error_tag = :span config.wrapper_tag = :div end José Valim blog.plataformatec.com @josevalim
  • SIMPLE FORM Mapping Input Column boolean check box boolean string text field string email email field string matching email url url field string matching url password password field string matching password text text area text file file field string respond to file methods hidden hidden field - numeric text field integer/float/decimal datetime date/time select datetime/data/time/timestamp association select/radio/check box associations country country select string matching country time_zone time zone select string matching time_zone José Valim blog.plataformatec.com @josevalim
  • html5! SIMPLE FORM Mapping Input Column boolean check box boolean string text field string email email field string matching email url url field string matching url password password field string matching password text text area text file file field string respond to file methods hidden hidden field - numeric text field integer/float/decimal datetime date/time select datetime/data/time/timestamp association select/radio/check box associations country country select string matching country time_zone time zone select string matching time_zone José Valim blog.plataformatec.com @josevalim
  • EM 140 CARACTERES José Valim blog.plataformatec.com @josevalim
  • SimpleForm ajuda você a criar formulários através de uma simples DSL (baseada no Formtastic) com markup flexível José Valim blog.plataformatec.com @josevalim
  • WORKFLOW José Valim blog.plataformatec.com @josevalim
  • rails g simple_form:install Copia um initializer para configurar a sua aplicação, um arquivo de I18n e um template para geradores de código José Valim blog.plataformatec.com @josevalim
  • rails g simple_form:install Copia um initializer para configurar a sua aplicação, um arquivo de I18n e um template para geradores de código o quê? José Valim blog.plataformatec.com @josevalim
  • $ rails g simple_form:install create config/initializers/simple_form.rb create config/locales/simple_form.en.yml create lib/templates/erb/scaffold/_form.html.erb José Valim blog.plataformatec.com @josevalim
  • initializer $ rails g simple_form:install create config/initializers/simple_form.rb create config/locales/simple_form.en.yml create lib/templates/erb/scaffold/_form.html.erb José Valim blog.plataformatec.com @josevalim
  • initializer locale $ rails g simple_form:install create config/initializers/simple_form.rb create config/locales/simple_form.en.yml create lib/templates/erb/scaffold/_form.html.erb José Valim blog.plataformatec.com @josevalim
  • initializer locale $ rails g simple_form:install create config/initializers/simple_form.rb create config/locales/simple_form.en.yml create lib/templates/erb/scaffold/_form.html.erb template para geradores de código José Valim blog.plataformatec.com @josevalim
  • Na próxima vez que o scaffold gerar a partial _form.html.erb, ele usará o template disponível em lib/templates/erb/scaffold/_form.html.erb José Valim blog.plataformatec.com @josevalim
  • Scaffold customizável == Rails 3 Awesomeness José Valim blog.plataformatec.com @josevalim
  • PLANOS José Valim blog.plataformatec.com @josevalim
  • ✦ Trazer mais novidades do HTML5 ✦ Melhorar integração com as validações do Rails José Valim blog.plataformatec.com @josevalim
  • José Valim blog.plataformatec.com @josevalim
  • RESPONDERS http://github.com/plataformatec/responders José Valim blog.plataformatec.com @josevalim
  • <uma-pequena-introdução-ao-respond-with> José Valim blog.plataformatec.com @josevalim
  • RAILS 2.3 def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end José Valim blog.plataformatec.com @josevalim
  • RAILS 3.0 respond_to :html, :xml def index @users = User.all respond_with(@users) end José Valim blog.plataformatec.com @josevalim
  • RAILS 3.0 respond_to :html, :xml Formato para navegação def index @users = User.all respond_with(@users) end José Valim blog.plataformatec.com @josevalim
  • RAILS 3.0 respond_to :html, :xml Formato para navegação def index Formato @users = User.all para API respond_with(@users) end José Valim blog.plataformatec.com @josevalim
  • Navegação API GET POST PUT DELETE José Valim blog.plataformatec.com @josevalim
  • Navegação API GET POST PUT DELETE José Valim blog.plataformatec.com @josevalim
  • Navegação API GET POST PUT DELETE José Valim blog.plataformatec.com @josevalim
  • def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end José Valim blog.plataformatec.com @josevalim
  • Navegação API render GET render template collection.to_format POST PUT DELETE José Valim blog.plataformatec.com @josevalim
  • RAILS 2.3 def create @user = User.new(params[:user]) respond_to do |format| if @user.save format.html { redirect_to @user, :notice => 'User was successfully created' } format.xml { render :xml => @user, :status => :created, :location => @user } else format.html { render :action => "new" } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end José Valim blog.plataformatec.com @josevalim
  • Navegação API render GET render template collection.to_format Sucesso POST Erro PUT DELETE José Valim blog.plataformatec.com @josevalim
  • RAILS 2.3 def create @user = User.new(params[:user]) respond_to do |format| if @user.save format.html { redirect_to @user, :notice => 'User was successfully created' } format.xml { render :xml => @user, :status => :created, :location => @user } else format.html { render :action => "new" } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end José Valim blog.plataformatec.com @josevalim
  • Navegação API render GET render template collection.to_format render Sucesso redirect_to resource resource.to_format POST Erro render :new render resource.errors PUT DELETE José Valim blog.plataformatec.com @josevalim
  • Navegação API render GET render template collection.to_format render Sucesso redirect_to resource resource.to_format POST Erro render :new render resource.errors Sucesso redirect_to resource head :ok PUT Erro render :edit render resource.errors DELETE redirect_to collection head :ok José Valim blog.plataformatec.com @josevalim
  • TRÊS VARIÁVEIS ✦ Verbo HTTP ✦ Estado do recurso ✦ Formato da requisição José Valim blog.plataformatec.com @josevalim
  • respond_with(@users) José Valim blog.plataformatec.com @josevalim
  • respond_with(@users) ActionController::Responder José Valim blog.plataformatec.com @josevalim
  • respond_with(@users) ActionController::Responder Navigational API GET render template render collection.to_format Sucesso redirect_to resource render resource.to_format POST Erro render :new render resource.errors Sucesso redirect_to resource head :ok PUT Erro render :edit render resource.errors DELETE redirect_to collection head :ok José Valim blog.plataformatec.com @josevalim
  • respond_with(@users) ActionController::Responder Navigational API GET render template render collection.to_format Sucesso redirect_to resource render resource.to_format POST Erro render :new render resource.errors Sucesso redirect_to resource head :ok PUT Erro render :edit render resource.errors DELETE redirect_to collection head :ok José Valim blog.plataformatec.com @josevalim
  • respond_with(@users) ActionController::Responder table.to_code Navigational API GET render template render collection.to_format Sucesso redirect_to resource render resource.to_format POST Erro render :new render resource.errors Sucesso redirect_to resource head :ok PUT Erro render :edit render resource.errors DELETE redirect_to collection head :ok José Valim blog.plataformatec.com @josevalim
  • Encapsula como a sua aplicação responde a uma requisição José Valim blog.plataformatec.com @josevalim
  • </uma-pequena-introdução-ao-respond-with> José Valim blog.plataformatec.com @josevalim
  • RAILS 3.0 # app/controllers/users_controller.rb def create @user = User.new(params[:user]) flash[:notice] = 'User was successfully created' if @user.save respond_with(@user) end José Valim blog.plataformatec.com @josevalim
  • RAILS 3.0 + RESPONDERS # app/controllers/users_controller.rb def create @user = User.new(params[:user]) @user.save respond_with(@user) end # config/locales/en.yml en: flash: users: create: notice: “User was successfully created” José Valim blog.plataformatec.com @josevalim
  • CLIENT SERVER GET /posts/1.xml 1 2 find resource 3 HTTP 1.1 200 OK <post> <title>Rails 3 rocks</title> ... </post> GET /posts/1.xml 4 5 find resource 6 HTTP 1.1 200 OK <post> <title>Rails 3 rocks</title> ... </post> José Valim blog.plataformatec.com @josevalim
  • CLIENT SERVER GET /posts/1.xml 1 2 find resource 3 HTTP 1.1 200 OK Last-Modified: Mon, 17 Apr 2010 14:00:00 GMT <post> <title>Rails 3 rocks</title> ... </post> GET /posts/1.xml If-Modified-Since: Mon, 17 Apr 2010 14:00:00 GMT 4 5 find resource and check data 6 HTTP 1.1 304 Not Modified José Valim blog.plataformatec.com @josevalim
  • RESPONDERS ✦ DRY ✦ Suporte a I18n ✦ HTTP Cache José Valim blog.plataformatec.com @josevalim
  • RESPONDERS config.generators.scaffold_controller :responders José Valim blog.plataformatec.com @josevalim
  • EM 140 CARACTERES José Valim blog.plataformatec.com @josevalim
  • Responders extende o comportamento do respond_with do Rails adicionando mensagens flash com I18n e HTTP Cache José Valim blog.plataformatec.com @josevalim
  • WORKFLOW José Valim blog.plataformatec.com @josevalim
  • rails g responders:install Copia um initializer para configurar a sua aplicação e um arquivo de I18n José Valim blog.plataformatec.com @josevalim
  • RESPONDERS class AppResponder < ActionController::Responder include Responders::FlashResponder include Responders::HttpCacheResponder end ApplicationController.responder = AppResponder José Valim blog.plataformatec.com @josevalim
  • PLANOS José Valim blog.plataformatec.com @josevalim
  • ✦ Aguardando pull requests :) José Valim blog.plataformatec.com @josevalim
  • RESUMINDO José Valim blog.plataformatec.com @josevalim
  • the way •Devise •SimpleForm •Responders José Valim blog.plataformatec.com @josevalim
  • Uma caixa de ferramentas que acelera a configuração inicial da aplicação e ao mesmo tempo fornece uma base sólida para customizações e extensões José Valim blog.plataformatec.com @josevalim
  • OBRIGADO! E tem muito mais em http://github.com/plataformatec José Valim blog.plataformatec.com @josevalim
  • OBRIGADO! E tem muito mais em http://github.com/plataformatec ID blog twitter José Valim blog.plataformatec.com @josevalim