Pergunta

Eu gosto de todas as rotas padrão que são gerados pelo trilho do map.resources . Mas, há casos em que eu gostaria de usar um identificador não-numérico em meus rotas. Por exemplo, se tiver uma rota aninhada consistem de usuários e seus artigos, uma rota padrão poderia ser escrito assim:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

No entanto, existem muitas vantagens / razões para não usar o padrão numérico identificador gerado pelo Rails. Existe uma maneira para substituir o padrão: params ID para outro identificador canônica da minha escolha sem resultante para escrever rotas personalizados para qualquer ação padrão? Diga se eu quiser uma rota no seguinte formato:

'/users/:login/articles/:id'

É este tipo de rotas alcançáveis ??usando map.resources ?

Foi útil?

Solução

A partir do Rails 2.3, não é possível mudar o nome do parâmetro e ainda usar o encaminhamento automático que #resources fornece.

Como alternativa, você pode mapear articles com um :path_prefix e :name_prefix:

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"

O :path_prefix afeta a URL, eo :name_prefix afeta as rotas nomeadas gerados, para que você vai acabar com estas rotas:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}

Como uma regra de ouro-geral, porém, eu ia ficar com a convenção padrão Rails de :user_id, com o encaminhamento que você postou sua pergunta. É geralmente entendido que :id e :user_id não implicam necessariamente "identificador numérico" - elas implicam "identificador de recurso," o que quer que seja. E aderindo à convenção padrão, seu código será mais fácil de entender para qualquer um que é rotas de recursos usados ??no Rails.

Para usar um identificador não numérico para um recurso, apenas #to_param redefinição do seu modelo. Então, certifique-se de usar um localizador em seu controlador que vai encontrar por este identificador (em vez do ID numérico), como User#find_by_login!.

Outras dicas

Você pode alterar o padrão de usar o ID em URLs, substituindo to_param no seu modelo. por exemplo.

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"

A única outra mudança que você precisa fazer é encontrar usuários por login ao invés de ID em seus controladores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top