Trilhos 4 e 5
No Rails 4, :param
foi adicionada a opção, que parece fazer exatamente o que você está procurando. Você pode dar uma olhada no código do Rails 3 em comparação com o código do Rails 4 .
Detalhes
Você pode implementar isso facilmente em seu routes.rb
arquivo:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
A partir do lançamento do Rails 4, esta funcionalidade está documentada nos Guias do Rails .
Rails 3
Infelizmente, no Rails 3, a :key
opção para resources
foi removida, então você não pode mais alterar facilmente o nome das rotas criadas desta forma apenas passando uma opção extra.
Detalhes
Suponho que você já tenha feito o aplicativo funcionar da maneira que deseja no ano passado, mas irei abordar uma maneira de obter o efeito que você descreve no Rails 3 em routes.rb
. Envolverá apenas um pouco mais de trabalho do que o to_param
método. Você ainda pode definir parâmetros personalizados em rotas definidas usando scope
e match
(ou é primos get
, put
, post
, e delete
). Você simplesmente escreve o nome do parâmetro que deseja no matcher:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Você teria que adicionar manualmente todas as rotas que resources
cria automaticamente para você, mas alcançaria o que você está procurando. Você também pode usar efetivamente a :controller
opção com blocos scope
adicionais scope
para eliminar parte da repetição.
EDIT (8 de maio de 2014): Torne mais óbvio que a resposta contém informações para Rails 3 e 4. Atualize os links para o código para ir para números de linha exatos e commits para que eles funcionem por um longo período de tempo.
EDITAR (16 de novembro de 2014): Rails 4 deve estar no topo agora e incluir informações relevantes, já que é a versão atual do Rails há algum tempo.
EDIT (9 de agosto de 2016): Reflita que a solução ainda funciona no Rails 5 e atualize links desatualizados.