2010-04-23 6 views
175

Sto aggiungendo difficilmente i parametri di querystring a link_to a UrlHelper. Ho una vista indice, ad esempio, che contiene elementi dell'interfaccia utente per l'ordinamento, il filtraggio e l'impaginazione (tramite will_paginate). Il plugin will_paginate gestisce correttamente la persistenza all'interno della pagina dei parametri di querystring.Aggiungere i parametri di querystring a link_to

Esiste un meccanismo automatico per aggiungere i parametri di querystring a un percorso con nome oppure è necessario farlo manualmente? Una grande quantità di ricerche su questo costrutto apparentemente semplice mi ha lasciato senza tracce.

Modifica

Alcune delle sfide:

  1. Se ho due parametri querystring, secchio & ordinamento, come si fa impostare un valore specifico per uno di questi in un link_to, preservando il valore attuale dell'altro? Per esempio:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>??) %> 
    
  2. Se ho più parametri querystring, secchio & l'ordinamento & PAGE_SIZE, e voglio impostare il valore a uno di questi, c'è un modo per 'automaticamente' includono i nomi ei valori di i restanti parametri? Per esempio:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here]) %> 
    
  3. Il plugin will_paginate gestisce la variabile di pagina e altre variabili QueryString automaticamente. Non sembra essere un elemento dell'interfaccia utente automatico per la gestione delle dimensioni della pagina. Mentre ho visto il codice per creare un elenco selezionato di dimensioni di pagina, preferirei avere A elementi per questo (come SO). Parte di questa sfida è legata al n. 2, la parte è correlata a nascondere/mostrare questo elemento dell'interfaccia utente in base all'esistenza/non esistenza di record. Detto in un altro modo, voglio solo includere link di dimensioni della pagina se ci sono record per pagina. Inoltre, preferisco includere automaticamente le altre variabili QS (cioè pagina, bucket, ordinamento), piuttosto che doverle includere per nome nel link_to.

+0

possibile duplicato [modo più efficiente per passare la rotaie params hash t o named route] (http://stackoverflow.com/questions/4559916/more-efficient-way-to-pass-the-rails-params-hash-to-named-route) – random

+1

strettamente correlato: http: // stackoverflow .com/questions/2124862/link-to-send-parameters-along-the-url-and-grab-them-on-target-page –

risposta

283

Il API docs on link_to mostrano alcuni esempi di aggiunta di querystrings a entrambi i percorsi di nome e Oldstyle. È questo che vuoi?

link_to può anche produrre legami con ancore o stringhe di query:

link_to "Comment wall", profile_path(@profile, :anchor => "wall") 
#=> <a href="/profiles/1#wall">Comment wall</a> 

link_to "Ruby on Rails search", :controller => "searches", :query => "ruby on rails" 
#=> <a href="/searches?query=ruby+on+rails">Ruby on Rails search</a> 

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux") 
#=> <a href="/searches?foo=bar&amp;baz=quux">Nonsense search</a> 
+1

La tua risposta mi ha aiutato a risolvere # 1: <% = link_to "0" , profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Grazie. – craig

47

Se si desidera che il modo rapido e sporco e non preoccupatevi di attacco XSS, utilizzare params.merge per mantenere i parametri precedenti. per esempio.

<%= link_to 'Link', params.merge({:per_page => 20}) %> 

vedi: https://stackoverflow.com/a/4174493/445908

In caso contrario, controllare questa risposta: params.merge and cross site scripting

+45

Non farlo, ti apre fino agli attacchi xss. –

+0

@ DanielNill- Puoi spiegare – Yarin

+3

@Yarin C'è una spiegazione abbastanza buona a [questa domanda] (http://stackoverflow.com/questions/12271218/params-merge-and-cross-site-scripting). – James

22

Se si desidera mantenere params esistenti e non esporsi ad attacchi XSS, assicurarsi di pulire l'hash params, lasciando solo i params che la vostra applicazione può essere l'invio:

# inline 
<%= link_to 'Link', params.slice(:sort).merge(per_page: 20) %> 

 

Se lo si utilizza in più luoghi, pulire i params nel controller:

# your_controller.rb 
@params = params.slice(:sort, :per_page) 

# view 
<%= link_to 'Link', @params.merge(per_page: 20) %> 
3

Nel caso in cui si desidera passare in un blocco, per esempio, per un pulsante glyphicon, come nell'esempio seguente:

<%= link_to my_url, class: "stuff" do %> 
    <i class="glyphicon glyphicon-inbox></i> Nice glyph-button 
<% end %> 

Poi passano le query string params potrebbe essere realizzato attraverso:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %> 
    <i class="glyphicon glyphicon-inbox></i> Nice glyph-button 
<% end %>