2009-11-29 7 views
2

Supposant la routeRails: specifing params sans valeur LINK_TO

map.resources :articles 

comment obtenez-vous cette

/articles?most_popular 

en utilisant la méthode link_to?

essayé ce qui suit:

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 

Note: J'utilise inherited_resources avec has_scope

Répondre

3

Si vous n'ajoutez pas une valeur aux paramètres que vous ne respecterait la norme W3C, qui exige que la section params a la forme field=value.

Je vous recommande d'ajouter une nouvelle action: most_popular à votre contrôleur d'articles.

Sur votre routes.rb:

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

Sur votre contrôleur:

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

Sur votre point de vue:

link_to most_popular_articles_path() # /articles/most_popular 

Ce sera HTML conforme, vos urls regarderont pratiquement le même (en changeant un? par un /) et votre contrôleur sera simplifié (vous aurez l'action la plus d de l'index).

Cordialement!

Mise à jour (2017): Il semble que la norme W3C n'impose pas la syntaxe field=value (ou ne l'exige plus). Cependant, certains serveurs sont documentés pour "étouffer" sur les requêtes ne respectant pas cette syntaxe. Voir Is a url query parameter valid if it has no value? pour plus de détails.

+0

Je code exactement comme ça. Cependant j'ai commencé à refactoriser mon code ces derniers temps et je me demande comment RESTFUL et/ou recoomoended cette approche. N'est pas le "plus populaire" plutôt un filtre assentiel à indexer, donc plutôt une option de requête (filter = most_popular) – gorn

+1

Restful ne signifie pas seulement CRUD. Cela signifie que chaque URL peut être considérée comme une ressource. La question est: les articles les plus populaires sont-ils suffisamment différents des articles habituels pour mériter leur propre ressource? La réponse n'est pas "je dois avoir CRUD". C'est "ça dépend de l'application". Si elles ne sont pas très importantes, ajouter un filtre filter serait suffisant. Si elles étaient super importantes, elles mériteraient probablement leur propre contrôleur. Ma solution est intermédiaire. – kikito

+0

Oui, c'est très perspicace. Merci gorn – gorn

1

Le dernier exemple que vous avez:

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

est la bonne façon. Sinon, vous pouvez simplement construire le lien en main:

<a href="<%= articles_path %>?most_popular">articles</a>