Rotaie: specifica i parametri senza valore per link_to
-
08-07-2019 - |
Domanda
Supponendo il percorso
map.resources :articles
come si ottiene questo
/articles?most_popular
utilizzando il metodo link_to
?
ha provato quanto segue:
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: sto usando eredited_resources con has_scope
Soluzione
Se non aggiungi un valore ai parametri non rispetterai lo standard W3C, che impone che la sezione params abbia il formato field = value
.
Ti consiglio invece di aggiungere una nuova azione most_popular al tuo controller articoli.
Sul tuo route.rb:
map.resources :articles, :collection => {:most_popular=>:get}
Sul controller:
class ArticlesController < ApplicationController
...
def most_popular
@articles = ...
end
Sul tuo punto di vista:
link_to most_popular_articles_path() # /articles/most_popular
Questo sarà conforme a HTML, i tuoi URL appariranno praticamente uguali (cambiando uno? di uno /) e il tuo controller sarà semplificato (avrai l'azione most_popular separata dall'indice).
Saluti!
Aggiornamento (2017) : sembra che lo standard W3C non imponga la sintassi field = value
(o non lo richieda più). Tuttavia, alcuni server sono documentati su "choke" su query non conformi a questa sintassi. Vedi È un parametro di query URL valido se ha nessun valore? per i dettagli.
Altri suggerimenti
L'ultimo esempio che hai:
link_to articles_path(:most_popular => true) # /articles?most_popular=true
È il modo corretto. Altrimenti potresti semplicemente costruire il link a mano:
<a href="<%= articles_path %>?most_popular">articles</a>