Pergunta

DocumentsController # common_query pode lidar com vários estilos diferentes de solicitação.

i. todos os documentos em lote 4 ou todos os documentos com a tag "feliz"

Eu quero uma única rota para fazer em bonita, por isso:

/ documentos / common_query? Lote = 4

/ documentos / common_query? Tag = feliz

tornar-se:

/ documentos / batch / 4

/ documentos / tag / feliz

Assim, o resultado final é que #common_query é chamado, mas parte da url foi usado como o nome param e parte como de valor.

Foi útil?

Solução

Como uma única rota:

ActionController::Routing::Routes.draw do |map|
  map.connect "documents/:type/:id", :controller => "documents_controller", 
              :action => "common_query"
end

Então params[:type] será ou "batch" ou "tag" e params[:id] quer "4" ou "happy". Você terá de se certificar de que outras acções de DocumentsController vir antes isso nas rotas, porque isso irá corresponder a qualquer URL que se parece com "documents/*/*".

Mas por que isso tem que ser uma única rota? Você pode usar duas rotas como este:

map.with_options(:controller => "documents_controller", 
                 :action => "common_query") do |c|
  c.connect "documents/batch/:page", :type => "batch"
  c.connect "documents/tag/:tag",    :type => "tag"
end

que irá ter o mesmo efeito, mas é mais específico, para que você não precisa se preocupar com a ordem de prioridade das rotas.

Outras dicas

A segunda opção, com duas vias, é quase certamente a melhor maneira de ir, porque ela só vai coincidir com os tipos de URLs que deseja apoio, enquanto a primeira opção irá também "jogo" URLs como / documentos / foo / bar, o que provavelmente fará com que seu método #common_query para, na melhor das hipóteses, retornar uma resposta RecordNotFound (404). Na pior das hipóteses, se você não está pronto para não ver qualquer um dos seus parâmetros esperados, você poderá obter um erro 500 em vez ...

É claro que, se você começar a ter um monte de variações, você acaba com um monte de rotas. E se você precisar usá-los em combinação, por exemplo, / documentos / batch / 4 / tag / feliz, então você vai precisar usar uma rota wildcard, e fazer o processamento de parâmetros em seu controlador. Isso poderia ser algo como:

map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"

Os vários elementos do URL estará disponível o seu controlador como params [: especificações]. Você pode transformar isso em um achado assim:

@items = Item.find(:all, :conditions => Hash[params[:specs]])

Isso Hash [] técnica convertidos a uma matriz dimensional de opções em um hash de valores-chave, o que pode ser útil mesmo se você não está alimentando-o diretamente a um find ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top