Como renomear o identificador param default “id” no map.resources Rails ()?
-
03-07-2019 - |
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 ?
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.