Ajuda com rotas de Rails
-
22-08-2019 - |
Pergunta
Say se eu tiver um controlador, perfil, que tem apenas duas ações. O primeiro é list
, que só vai mostrar a lista de nomes. Eu quero esses nomes para ser links que irá levá-lo para uma página que mostra o perfil completo. Então eu preciso de uma segunda ação, view
, que pode então cama alimentado um parâmetro para indicar qual o perfil de vista.
Por exemplo: eu acessar /profile/list
, então se eu quiser ver o perfil de John, eu vou clique no seu nome que deve me levar para /profile/view/john
. Minha ação vista vai ler o parâmetro de john e, em seguida, fazer as consultas de banco de dados apropriadas.
Que mudanças que eu tenho que fazer para routes.rb para que isso aconteça? Felicidades.
Solução
Eu prefiro usar o padrão: controller /: action /:. Rota id para proteger contra casos em que existem 2 João na lista ??p>
Para se ter uma rota personalizada como você mencionou editar routes.rb para incluir um novo
map.connect ':controller/:action/:user_name'
Agora, um pedido como o perfil / view / john deve chegar até você como
@params = {:controller => "profile", :action=> "view", :user_name => "john"}
Use as params [: user_name] valor para localizar e exibir o registro relevante em ação a visão do controlador. Você também pode querer configurar alguns requisitos no: parte user_name da url, por exemplo, ele tem que corresponder / SomeRegexpToValidateNames /
map.connect ':controller/:action/:user_name',
:requirements => {:user_name => /\w+/}
Outras dicas
Se você deseja identificar perfis por nome, como "/ perfil / view / john" você pode usar o plug-in permalink_fu
http://www.seoonrails.com/even-better -que procuram-urls-com-permalink_fu
que irá mantê-lo longe de problemas quando há duplicação de nomes ...
Se o modelo é "user" você tem que substituir o método to_param. Isso permitirá que você para retornar o "id-name" do usuário em vez do "id". (Ex: perfil / / view / 23-john)
Eu sei, não é exatamente o que você pediu, mas isso deve ser uma solução fácil.
class User < ActiveRecord::Base
def to_param
"#{id}-#{name.gsub(/\W/, '-').downcase}"
end
end
E basta adicionar uma declaração de recursos simples para a configuração de roteamento:
map.resources :users