You are on page 1of 39

Ruby on Rails 103

Juliana Lucena
Scia e Lder tcnico, Redu Core

10 de Abril de 2014
Antes de tudo
Antes de tudo
A Documentao sua amiga
http://api.rubyonrails.org/
http://guides.rubyonrails.org/
http://rubyonrails.org/
Um pouco mais de
Query Interface
Filtra por atritbuto(s) nd_by
Query Interface
User.find_by(first_name: "Matheus")
SELECT "users".* FROM "users" WHERE "users"."first_name" = 'Matheus' LIMIT 1
# => #<User id: 3, first_name: "Matheus", email: "matheus@example.com",
last_name: nil, age: nil, created_at: "2014-03-20 23:18:15", updated_at:
"2014-03-20 23:18:15">
Seleciona registros em batch (blocos)
nd_each



Informa tamanho do batch
Query Interface
User.find_each do |u|
Newsletter.new(user: user).deliver
end
SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1000
# => true
User.find_each(batch_size: 50) do |u|
Newsletter.new(user: user).deliver
end
SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 50
# => true
Seleciona quais colunas sero
carregadas select
Query Interface
User.select(:age).to_a
SELECT age FROM "users"
# => [#<User id: nil, age: 40>, #<User id: nil, age: nil>, #<User
id: nil, age: nil>, #<User id: nil, age: 20>]
User.select(:age, :id).to_a
SELECT age, id FROM "users"
# => [#<User id: 1, age: 40>, #<User id: 2, age: nil>, #<User id:
3, age: nil>, #<User id: 4, age: 20>]
Carrega apenas os valores das colunas
(no instancia o objeto)
Query Interface
User.pluck(:age)
SELECT "users"."age" FROM "users"
# => [40, nil, nil, 20]
User.pluck(:age, :id)
SELECT "users"."age", "users"."id" FROM "users"
# => [[40, 1], [nil, 2], [nil, 3], [20, 4]]
Carrega associaes para evitar diversas
consultas includes
Query Interface
User.all.each do |u|
puts u.books.map(&:name)
end
User Load (0.3ms) SELECT "users".* FROM "users"
Book Load (0.2ms) SELECT "books".* FROM "books" WHERE "books"."user_id" = ? [
["user_id", 1]]
# => rails
Book Load (0.1ms) SELECT "books".* FROM "books" WHERE "books"."user_id" = ? [
["user_id", 2]]
Book Load (0.1ms) SELECT "books".* FROM "books" WHERE "books"."user_id" = ? [
["user_id", 3]]
Book Load (0.1ms) SELECT "books".* FROM "books" WHERE "books"."user_id" = ? [
["user_id", 4]]
# => dom casmurro
# => 1984
# => [#<User id: 1, first_name: "Alex", email: asg@cin.ufpe.br(...)]
Carrega associaes para evitar diversas
consultas includes
Query Interface
User.includes(:books).each do |u|
puts u.books.map(&:name)
end
User Load (0.4ms) SELECT "users".* FROM "users"
Book Load (0.3ms) SELECT "books".* FROM "books" WHERE "books"."user_id" IN (1,
2, 3, 4)
# => rails
# => dom casmurro
# => 1984
#=> [#<User id: 1, first_name: "Alex", email: asg@cin.ufpe.br", (...)]
Action Pack
Framework para manipular e responder
requisies Web
Proporciona as camadas de View e
Controlador (MVC)
Action Pack
Conveno sobre
Congurao
Conveno sobre
Congurao
StoriesController#new
new.html.erb
/stories/new
Routing
w
Controlador
Como gerar um
Controlador
$ rails g controller Stories new create show
generate
nome do controlador
actions que o controlador ter
class StoriesController < ApplicationController
def new
end

def create
end

def show
end
end
Controlador Simples
class StoriesController < ApplicationController
def show
@story = Story.find(params[:id])
end
end
ApplicationController
Herda de ActionController::Base
D acesso aos params, ltros, redirect_to, etc.
Controlador Simples
Para ser acessada na view, a varivel
precisa ser de instncia (@story)

params acessa os parmetros da


requisio
Customizao da
Resposta
Customizao da
Resposta
possvel fugir do princpio de
Conveno sobre Congurao quando
necessrio
Redirect Responde ao browser com um
cdigo de status HTTP de redirecionamento
Render Responde ao browser de forma
completa
Customizao da
Resposta
Render e redirect simples
class StoriesController < ApplicationController
def create
story = Story.new(params[:story])
if story.save
redirect story_path(story)
else
render 'new'
end
end
Chegaremos nesta parte
Customizao da
Resposta
Mais opes?
http://guides.rubyonrails.org/
layouts_and_rendering.html#creating-
responses
Parmetros
Parmetros
Permite acesso aos parmetros da
requisio
Um hash
No faz distino de parmetros entre
diferentes verbos HTTP
GET /stories?status=done
PUT /stories/10
params[:status]
params[:story]
Parmetros
Permite acesso aos parmetros da
requisio
Array:
> params[:ids]
=>["1", "2", "3"]
GET /stories?ids[]=1&ids[]=2&ids[]=3
Parmetros
Permite acesso aos parmetros da
requisio
Hash:
> params[:client]
=>{"name => "Acme", "phone" => "12345", "address" =>
{"postcode" => "12345", "city" => "Carrot City"}}
<form accept-charset="UTF-8" action="/clients" method="post">
<input type="text" name="client[name]" value="Acme" />
<input type="text" name="client[phone]" value="12345" />
<input type="text" name="client[address][postcode]" value="12345" />
<input type="text" name="client[address][city]" value="Carrot City" />
</form>
Parmetros
Permite acesso aos parmetros da
requisio
JSON:
> params[:story]
=> { "name": "rails102", "sprint_points": "3" }
{ "story": { "name": "rails102", "sprint_points": "3" } }
Routing
Routing
Responsvel por instanciar o
controlador relativo a URL solicitada
Gera helpers com as URLs da aplicao
Para saber as rotas da aplicao:
$ rake routes
Routing
Denio de rotas:
Rotas REST
Rotas no REST
match, post, get
...
Denio de rotas:
Routing
Rails102::Application.routes.draw do
root :to => 'stories#index'

resources :stories, except: [:edit, :update] do
member do
post 'rate'
end

get 'search', on: :collection
end

match '/logout' => 'sessions#destroy',
as: :logout, via: :post
end
config/routes.rb
Routing
resources :stories
Helper Verbo HTTP URL Controlador#action
stories GET /stories(.:format) stories#index
POST /stories(.:format) stories#create
new_story GET /stories/new(.:format) stories#new
edit_story GET /stories/:id/edit(.:format) stories#edit
story GET /stories/:id(.:format) stories#show
PUT /stories/:id(.:format) stories#update
DELETE /stories/:id(.:format) stories#destroy
stories_path /stories
gera
Os parmetros que fazem parte da URL
(query string) tambm podem ser
acessados atravs do params
Routing
/stories/:id/edit(.:format)
params[:id]
Views
Views
html.erb HTML com cdigo ruby
embutido (embedded ruby)
O cdigo ruby avaliado e adiciona,
dinamicamente, contedo na pgina
HTML

<% ... %> Cdigo ruby

<%= ... %> Cdigo ruby, o resultado


ser adicionado pgina
Dojo
Dojo
Projeto base: https://github.com/redu/
formacao-ruby-redu/tree/master/2-
exercicio-rails-models
Dojo
Requisitos:
Visualizar um usurio
Listar usurios
Obrigada. :)

You might also like