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.

Foi útil?

Solução

Eu prefiro usar o padrão: controller /: action /:. Rota id para proteger contra casos em que existem 2 João na lista

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top