terça-feira, 6 de outubro de 2009

Rails: Rotas


Fala rapazeada... Hoje algumas notas sobre rotas:

1º- Diferença entre member e collection:

map.resources :notas, :member => { :baixar => :get }
map.resources :notas, :collection => { :baixar => :get }
A rota para collection será: "/notas/baixar". E para member será necessário informar um id, assim: "/notas/2/baixar"

2º - Herança:

Da mesma forma que é preciso informar na model quando uma tabela depende da outra, assim:

class Pessoa < ActiveRecord::Base;end class Telefone < ActiveRecord::Base; belongs_to Pessoa; end


É necessário fazer suas relações nas rotas, assim:

map.resources :pessoas do |pessoa|
pessoa.resources :telefones
end

Ficando assim:
---------------------------------------------------------------------------------------------------------------------------------------------
| Método | Rota | Chamada |
---------------------------------------------------------------------------------------------------------------------------------------------
| new_pessoa GET | /pessoas/new | {:action=>"new", :controller=>"pessoas"} |
| formatted_new_pessoa GET | /pessoas/new.:format | {:action=>"new", :controller=>"pessoas"} |
| edit_pessoa GET | /pessoas/:id/edit | {:action=>"edit", :controller=>"pessoas"} |
| formatted_edit_pessoa GET | /pessoas/:id/edit.:format | {:action=>"edit", :controller=>"pessoas"} |
| pessoa GET | /pessoas/:id | {:action=>"show", :controller=>"pessoas"} |
| formatted_pessoa GET | /pessoas/:id.:format | {:action=>"show", :controller=>"pessoas"} |
| pessoa_telefones GET | /pessoas/:pessoa_id/telefones | {:action=>"index", :controller=>"telefones"} |
| formatted_pessoa_telefones GET | /pessoas/:pessoa_id/telefones.:format | {:action=>"index", :controller=>"telefones"} |
| POST | /pessoas/:pessoa_id/telefones | {:action=>"create", :controller=>"telefones"} |
| POST | /pessoas/:pessoa_id/telefones.:format | {:action=>"create", :controller=>"telefones"} |
| new_pessoa_telefone GET | /pessoas/:pessoa_id/telefones/new | {:action=>"new", :controller=>"telefones"} |
| formatted_new_pessoa_telefone GET | /pessoas/:pessoa_id/telefones/new.:format | {:action=>"new", :controller=>"telefones"} |
| edit_pessoa_telefone GET | /pessoas/:pessoa_id/telefones/:id/edit | {:action=>"edit", :controller=>"telefones"} |
| formatted_edit_pessoa_telefone GET | /pessoas/:pessoa_id/telefones/:id/edit.:format | {:action=>"edit", :controller=>"telefones"} |
| pessoa_telefone GET | /pessoas/:pessoa_id/telefones/:id | {:action=>"show", :controller=>"telefones"} |
| formatted_pessoa_telefone GET | /pessoas/:pessoa_id/telefones/:id.:format | {:action=>"show", :controller=>"telefones"} |
| PUT | /pessoas/:pessoa_id/telefones/:id | {:action=>"update", :controller=>"telefones"} |
| PUT | /pessoas/:pessoa_id/telefones/:id.:format | {:action=>"update", :controller=>"telefones"} |
| DELETE| /pessoas/:pessoa_id/telefones/:id | {:action=>"destroy",:controller=>"telefones"} |
| DELETE| /pessoas/:pessoa_id/telefones/:id.:format | {:action=>"destroy",:controller=>"telefones"} |
---------------------------------------------------------------------------------------------------------------------------------------------

3º - Namespace

Nao sei pra que serve... mas tivemos a necessidade de usa-lo pois, numa mesma estrutura de aplicativo existiam dois projetos. Ou seja, para identificar quais controllers sao usadas em um projeto e quais sao usadas em outro, voce pode suar o namespace, assim:

map.namespace(:projeto_um) do |um|
# rotas do projeto um
um.resources :pessoas
end

Dessa forma todos as controllers que são do projeto um, ficam numa pasta dentro de controllers chamada projeto_um e assim para o projeto_dois, ou quantos namespace eu tiver. Isso é válido para toda a estrutura da aplicação ou seja para views será necessário ter uma pasta nomeada com o namespace (projeto_um) com as respectivas views e assim por diante.

Isso ficará da seguinte forma:
http://localhost/projeto_um/pessoas

Ou seja, para todas as rotas eu terei o namespace na frente.

E quando eu tiver uma unica controller válida para os dois projetos, que namespace colocar na rota?
Vamos imaginar que no projeto um eu tenho a controller telefones que pode ser usada no projeto dois também... você pode fazer da seguinte forma:
map.namespace(:projeto_um) do |um|
um.resources :telefones, :namespace => nil
end
map.namespace(:projeto_dois) do |dois|
um.resources :telefones, :namespace => nil
end

Assim a controller telefone será acessada de qualquer namespace: projeto_um ou projeto_dois.

Lembrando que a controller e as views de telefone deverão ser posta fora das pastas que englobam os arquivos especificos de cada projeto. Ou seja, a controller telefone ficará dentro do diretorio controller.

É isso... não tem muito segredo, caso pareça o contrário aqui tudo o que você pode aprender sobre rotas, dentro das magias e convenções de RUBY ON RAILS.

Fica assim entao, rapazeada. Duvidas, correcoes, reclamações e/ou sugestoes fiquem a vontade para informar.

Abraço.

Um comentário:

  1. Ae rapazinho, agora soh falta trabalhar 100% com isso neh... hahahaha nada de HighGambys!

    UAhuAHuAH.
    abraço!

    ResponderExcluir