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.
param
opção para trilhos 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, o que pode ser confuso.no Rails 4, passe a opção param para alterar os: id params. Por exemplo,
resources :photos, param: :photo_name
irá gerar / photos /: photo_namefonte
Se entendi bem, o que você quer é ter o em
client_name
vez deid
na sua url, certo?Você pode fazer isso substituindo o
to_param
método em seu modelo. Você pode obter mais informações aqui .fonte
Existe uma joia para isso, assim como existe uma joia para tudo;)
Tenho usado o FriendlyId para esse tipo de comportamento no Rails 3.
Será necessário que você adicione algum código ao seu modelo, como este:
... e se seus clientes não têm nomes compatíveis com URI, você pode querer usar um slug para isso, o que você pode usar
has_friendly_id :name, :use_slug => true
. Ao usar slugs, você obviamente precisará persisti-los no banco de dados também.E como já mencionado, você ainda pode usar o
to_param
truque com o rails 3, conforme documentado aqui . Acho o FriendlyId um pouco mais versátil.fonte
to_param
, ele usa , mas também faz outras coisas inteligentes em segundo plano. Encontrei o link aqui: stackoverflow.com/questions/4744446/…to_param
quebra minha parte do front-end do aplicativo. Na verdade, estou procurando desesperadamente pela abordagem de roteamento. Devo alterar minha API, mas sem quebrar a parte de modelo e front-end do aplicativo. Por que não posso apenas ter a abordagem de apenas modificar as rotas apenas como eu disse e o post de exemplo para uma versão mais antiga do rails acima ???@client = Client.find(:name => param[:client_name]
emClientsController#show
? Isso pode funcionar.Client.where(:name => param[:client_name]).first
, isso é.No Rails 3 você pode renomear as chaves de id usando uma combinação de namespaces e escopos como este (não muito bom):
fonte