Esta palestra apresentará as funcionalidades disponibilizadas pelo framework web Ruby on Rails desde sua primeira versão até o Rails 4. Serão apresentadas as evoluções mais significativas de cada release e as principais características do Rails 4. Ruby on Rails tem se tornado cada vez mais popular e ganhado mais adeptos. Sempre ouço comentários de desenvolvedores de outras tecnologias que desejam conhecer melhor o framework, seja para implementar projetos pessoais ou mesmo dar um novo rumo na vida profissional. Acredito que uma apresentação das evoluções implementas nesta tecnologia permitirá que muitos desenvolvedores e entusiatas obtenham um conhecimento básico, o que facilitará seus estudos posteriores permitindo que possam aprofundar mais em cada tópico coberto na palestra. A palestra não tem o objetivo de entrar em detalhes técnicos das implementações, mas sim explicar e, sempre que possível exemplificar, o que passou a ser possível de ser implementado após cada release.
2. Apresentação
João Lucas Pereira de Santana
twitter | github | fb | gtalk: @jlucasps
Ciência da Computação pela UFLA
Desenvolvedor Ruby, Java, JavaScript
Instrutor Ruby on Rails
@jlucasps
#devday2013
3. Agenda
➔ Rails Full Stack - Request/Responder
➔ Primeira versão
◆ Active Support, Active Record, Action Pack, Action
Mailer
➔ Rails 2
➔ Rails 3
➔ Rails 4
@jlucasps
#devday2013
4. Rails Full Stack
➔ Origem
◆ David Heinemeier Hansson
@jlucasps
#devday2013
5. Rails Full Stack
➔ Rails Core Team
Jeremy Kemper
Michael Koziarski
Yehuda Katz
José Valim
Santiago Pastorino
Aaron Patterson
Xavier Noria
Jon Leighton
Rafael França
Andrew White
Guillermo Iguaran
Carlos Antonio
@jlucasps
#devday2013
6. Rails Full Stack
➔ Framework MVC para desenvolvimento Web
Session
Helpers
Logs
Testes
Middleware
Controller
Connections
Validations
Queries
Callbacks
Migrations
@jlucasps
Responders
Routes
Renders
Assets
Associations
Testes
HTTP/SSL
Helpers
Model
View
Builders
Testes
Templates
Partials
#devday2013
8. Rails Full Stack
REQUEST:
GET http://myapp.com/users/2/lists
ACCEPTED: passado para o App Server
Web Server
App Server
Request passado para o Rails
Rails
Controller
Model
@jlucasps
View
#devday2013
10. Rails Full Stack
Router
user_lists GET
/users/:user_id/lists(.:format)
lists#index
Controller e Action selecionadas:
GET /users/2/lists
CONTROLLER: "lists"
ACTION: "index"
NOME DA ROTA: "user_lists"
@jlucasps
#devday2013
12. Rails Full Stack
Model
@user = User.find(params[:user_id])
@lists = List.find_all_by_user_id(params[:user_id])
ListsController
index
new
User
Model
Active
Record
tabela 'users'
create
Banco de dados
update
@jlucasps
destroy
........
List
Model
Active
Record
tabela 'lists'
#devday2013
13. Rails Full Stack
REQUEST:
GET http://myapp.com/users/2/lists
ACCEPTED: passado para o App Server
Web Server
REQUEST passado para o Rails
App Server
Router
CONTROLLER recupera informações
dos MODELS para suprir a VIEW
Rails
PATH e METHOD mapeados para
CONTROLLER e ACTION
Controller
action
Model
@jlucasps
action
action
View
#devday2013
16. Rails Full Stack
REQUEST:
GET http://myapp.com/users/2/lists
ACCEPTED: passado para o App Server
Web Server
REQUEST passado para o Rails
App Server
Router
CONTROLLER recupera informações
dos MODELS para suprir a VIEW
VIEW cria a resposta para o RESPONSE
BODY
@jlucasps
Rails
PATH e METHOD mapeados para
CONTROLLER e ACTION
Controller
action
Model
action
action
View
#devday2013
17. Rails Full Stack
RESPONSE recebida :-)
RESPONSE é retornada para o browser
Web Server
RESPONSE volta através do middleware
stack
App Server
Rails
Router
VIEW cria a resposta para o RESPONSE
BODY
@jlucasps
Controller
action
Model
action
action
View
#devday2013
33. rails-0.10.0
➔ action_pack
◆ scaffold:
require 'account' # must be an Active Record class
class AccountController < ActionController::Base
scaffold :account
end
# templates: list, show, destroy, new, create, edit, update
@jlucasps
#devday2013
35. rails-0.10.0
➔ action_pack
◆ action view:
<!-- Embedded Ruby for templates: -->
<% for post in @posts %>
Title: <%= post.title %>
<% end %>
<!-- Helpers for forms, dates, action links, and text: -->
<%= text_field "post", "title", "size" => 30 %>
<%= html_date_select(Date.today) %>
<%= link_to "New post", :controller => "post", :action => "new" %>
<%= truncate(post.title, 25) %>
@jlucasps
#devday2013
36. rails-0.10.0
➔ action_pack
◆ action view:
<!-- Form building for Active Record model objects: -->
<%= form "post" %>
<!-- This form generates a @params["post"] array that can be used directly in a
save action
<!-- Rendering shared partials: -->
<%= render_partial "advertisement/ad", ad %>
@jlucasps
#devday2013
41. rails-0.13.0
➔ Migrations for PostgreSQL and MySQL
➔ Rendering: One method to bind them all
➔ Named routes
map.home '', :controller => 'main', :action => 'start'
redirect_to :controller => 'main', :action => 'start'
# above route is now redirect_to :home_url
➔ Coditional validations
validates_numericality_of :income, :if => :employed?
validates_presence_of :username, :if => Proc.new { |user| user.signup_step
>1}
@jlucasps
#devday2013
42. rails-1.1.0
➔ RJS: JavaScript written in Ruby
➔ Polymorphic associations
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
end
class Person < ActiveRecord::Base
has_one :address, :as => :addressable
end
class Company < ActiveRecord::Base
has_one :address, :as => :addressable
end
@jlucasps
#devday2013
43. rails-1.1.0
➔ calculations:
◆ sum, average, count, max
➔ Eager loading
# Single database query:
companies = Company.find(:all, :include => { :groups => { :members=> { :
favorites } } })
# Just 1 database query for all of this:
authors = Author.find(:all, :include => [ { :posts => :comments }, :
categorizations ])
authors[0].posts[0].comments[0].body # => "Rock on Rails!"
authors[0].categorizations[0].name
@jlucasps
# => "Less software"
#devday2013
44. rails-1.2
➔ respond_to e format
class WeblogController < ActionController::Base
def index
@posts = Post.find :all
respond_to do |format|
format.html
format.xml { render :xml => @posts.to_xml }
format.rss { render :action => “feed.rxml” }
end
end
end
GET /weblog # returns HTML from browser Accept header
GET /weblog.xml # returns the XML
GET /weblog.rss # returns the RSS
@jlucasps
#devday2013
45. rails-2
➔ action_pack:
◆ resources e collection resources
◆ multiview (show.html.erb, show.js.erb)
◆ CRSF token
◆ record identification:
# person is a Person object, which by convention will
# be mapped to person_url for lookup
redirect_to(person)
link_to(person.name, person)
form_for(person)
@jlucasps
#devday2013
46. rails-2.3
➔ nested_attributes
class Book < ActiveRecord::Base
has_one :author
has_many :pages
accepts_nested_attributes_for :author, :pages
end
➔ find with having
developers = Developer.find(:all, :group => "salary", :having => "sum(salary)
> 10000", :select => "salary")
@jlucasps
#devday2013
47. rails-3
➔ Bundler and Gemfile
➔ New ActiveRecord query engine:
users = User.where(:name => "david").limit(20)
users.order(:name).each { |user| puts user.name }
➔ Agnosticism with jQuery, rSpec, and Data
Mapper:
◆ DataMapper -> Active Record
◆ Query -> Prototype
◆ Spec -> test/unit
@jlucasps
#devday2013
50. rails-4
➔ Turbolinks
➔ Live streaming
➔ ActiveModel::Model
◆ validations, accessors, no persistence
➔ Deprecate routes by match
➔ Concerns routes
concern :commentable do
resources :comments
end
resources :articles, concerns: :commentable
resources :photos, concerns: :commentable
@jlucasps
#devday2013
51. rails-4
➔ Mass assignment protection from Models to
Controllers
class MessagesController < ApplicationController
def create
@message = Message.new(message_params)
@message.user = current_user
@message.save
end
private
def message_params
params.require(:message).permit(:content)
end
end
@jlucasps
#devday2013
52. Muito obrigado!
Um roadmap do Framework Ruby on
Rails
do Rails 1 ao Rails 4
João Lucas Pereira de Santana
@jlucasps