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

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top