Pergunta

Supondo que a rota

map.resources :articles

como você começa esta

/articles?most_popular

usando o método link_to?

tentei o seguinte:

link_to articles_path(:most_popular) # exception
link_to articles_path(:most_popular => nil) # /articles
link_to articles_path(:most_popular => true) # /articles?most_popular=true

Nota: eu estou usando inherited_resources com has_scope

Foi útil?

Solução

Se você não adicionar um valor para os parâmetros que você não será respeitando o padrão W3C, que mandatos que a seção params tem a forma field=value.

Eu recomendo que você adicionar um novo:. Ação most_popular a seus artigos controlador, em vez

Em seu routes.rb:

map.resources :articles, :collection => {:most_popular=>:get}

No controlador:

class ArticlesController < ApplicationController
...
def most_popular
  @articles = ...
end

No seu ponto de vista:

link_to most_popular_articles_path() # /articles/most_popular

Esta será HTML-compliant, seus urls ficará praticamente o mesmo (mudando um? Por um /) e seu controlador será simplificado (você terá a ação most_popular separado do índice).

Saudações!

Update (2017) : Parece que o padrão W3C não obriga a sintaxe field=value (ou não exige mais nada). No entanto, alguns servidores estão documentadas para "choke" em consultas que não cumpram com esta sintaxe. Consulte é uma URL consulta parâmetro válido se tiver nenhum valor? para mais detalhes.

Outras dicas

O último exemplo que você tem:

link_to articles_path(:most_popular => true) # /articles?most_popular=true

é a maneira correta. Caso contrário, você poderia simplesmente construir o link manualmente:

<a href="<%= articles_path %>?most_popular">articles</a>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top