Ruby on Rails 2.1 - Sistema de Rotas

O Rails analisa a URL para determinar o controlador, a ação e os parâmetros da solicitação. Com o roteamento Rails, partes da URL podem especificar parâmetros adicionais, e todo o processo de roteamento está sob seu controle. As regras de roteamento funcionam da mesma forma em qualquer servidor da web.

O arquivo config / routes.rb está no coração do sistema de roteamento Rails. Este arquivo contém regras que tentam corresponder ao caminho da URL de uma solicitação e determinam para onde direcionar essa solicitação. As regras são testadas na ordem em que são definidas no arquivo. A primeira regra que corresponde ao caminho de URL de uma solicitação determina o destino dessa solicitação.

O sistema de roteamento realmente faz duas coisas -

  • Ele mapeia solicitações para métodos de ação dentro dos controladores.

  • Ele grava URLs para você usar como argumentos para métodos como link_to, redirect_to e form_tag.

Assim, o sistema de roteamento sabe como transformar a URL de solicitação de um visitante em uma sequência de controlador / ação. Ele também sabe como fabricar strings de URL com base em suas especificações.

Considere a seguinte rota instalada pelo Rails ao gerar sua aplicação -

map.connect ':controller/:action/:id'

Esta rota afirma que espera que as solicitações consistam em um :controller seguido por um :action que por sua vez é alimentado com algum :id.

Se você receber uma solicitação de "http: // localhost: 3000 / book / edit / 2", ele será mapeado da seguinte maneira -

params = {  :controller => 'book',
   :action     => 'edit',
   :id         => '2'
}

Assim, o roteamento padrão (se você não modificar as regras de roteamento) é -

http://<base-url>/<controller>/<action>/<id>

Um URL como http://www.example.com/book/update/20 chama o update método (a ação) no BooksController classe (o controlador) com um id parâmetro definido com o valor 20.

O bloco de código a seguir configurará o book como o controlador padrão se nenhum outro for especificado. Significa que visitar '/' invocaria obook controlador.

ActionController::Routing:Routes.draw do |map|
   map.connect ':controller/:action/:id',:controller => 'book'
end

Você também pode definir uma ação padrão se nenhuma ação for especificada no URL fornecido -

ActionController::Routing:Routes.draw do |map|
   map.connect ':controller/:action/:id', 
   :action => 'edit',:controller => 'book'
end

Agora, você pode todos os métodos de edição dentro do controlador de livro para editar livro com ID como 20 da seguinte forma -

http://localhost:3000/2

Prioridade de rota

As rotas têm prioridade definida pela ordem de aparecimento das rotas no arquivo routes.rb. A prioridade vai de cima para baixo.

A última rota nesse arquivo tem a prioridade mais baixa e será aplicada por último. Se nenhuma rota corresponder, 404 é retornado.

Modificando a rota padrão

Você pode alterar a rota padrão de acordo com sua necessidade. No exemplo a seguir, vamos trocar o controlador e a ação da seguinte maneira -

# Install the default route as the lowest priority.
map.connect ':action/:controller/:id'

Agora, para chamar a ação de um determinado controlador , você teria que escrever seu URL da seguinte forma -

http://localhost:3000/action/controller/id

Não é particularmente lógico colocar ação e controlador em tal sequência. A rota padrão original (o padrão padrão) é melhor e recomendada.

A Rota Ante-Default

A rota 'pré-padrão' é a seguinte -

map.connect ':controller/:action/:id.:format'

O formato.: No final corresponde a um ponto literal e a um valor de "formato" curinga após o campo id. Isso significa que corresponderá, por exemplo, a um URL como este -

http://localhost:3000/book/show/3.xml

Aqui, dentro da ação do controlador, seu params[:format] será definido como xml.

A Rota Vazia

A rota vazia é o oposto da rota padrão. Em um arquivo routes.rb recém-gerado, a rota vazia é comentada, porque não há um padrão universal ou razoável para ela. Você precisa decidir o que esse URL de nada deve fazer para cada aplicativo que você escrever.

Aqui estão alguns exemplos de regras de rotas vazias bastante comuns -

map.connect '', :controller => "main", :action => "welcome"
map.connect '', :controller => "main"

Aqui está a explicação das regras acima -

  • O primeiro irá pesquisar a ação de boas-vindas dentro do controlador principal, mesmo se você digitar apenas http: // localhost: 3000.

  • Este último se conectará a http: // localhost: 3000 / main / index. Aqui, o índice é a ação padrão quando não há nada especificado.

Rails 2.0 introduz um método mapeador chamado root que se torna a maneira apropriada de definir a rota vazia para uma aplicação Rails, como este -

map.root :controller => "homepage"

Definir a rota vazia dá às pessoas algo para olhar quando se conectam ao seu site com nada além do nome de domínio.

Rotas Nomeadas

Conforme você continua desenvolvendo seu aplicativo, provavelmente terá alguns links para usar em todo o aplicativo. Por exemplo, você provavelmente colocará um link de volta para a página principal de listagens. Em vez de ter que adicionar a seguinte linha em todo o seu aplicativo, você pode criar uma rota nomeada que permite vincular a uma versão abreviada desse link -

link_to 'Home', :controller => 'classified', :action => 'list'

Você pode definir rotas nomeadas da seguinte maneira. Aqui, em vez de conectar , você está usando um nome exclusivo que pode ser definido. Nesse caso, a rota é chamada de casa . O resto da rota é semelhante a outras que você criou.

map.home '', :controller => 'classified', :action => 'list'

Agora, você pode usar isso nos controladores ou visualizações da seguinte forma -

<%= link_to 'Back', home_url %>

Aqui, em vez de listar a ação : controller e : à qual você fará o link, você está colocando o nome da rota seguido por _url. Seu usuário não deve notar nenhuma diferença. O roteamento nomeado é meramente uma conveniência para o desenvolvedor Rails economizar um pouco de digitação. O caso acima pode ser escrito sem a rota nomeada da seguinte forma -

<%= link_to 'Back', {:action => 'list'} %>

URLs bonitos

As rotas podem gerar URLs bonitos. Por exemplo -

map.connect 'articles/:year/:month/:day',
   :controller => 'articles',
   :action     => 'find_by_date',
   :year       => /\d{4}/,
   :month      => /\d{1,2}/,
   :day        => /\d{1,2}/

# Using the route above, the url below maps to:
# params = {:year => '2005', :month => '11', :day => '06'}
# http://localhost:3000/articles/2005/11/06

Para obter mais detalhes sobre as rotas, consulte ActionController::Routing.