Aggiungi i parametri di querystring a link_to


214

Ho difficoltà ad aggiungere parametri di querystring a link_to UrlHelper. Ho una vista indice, ad esempio, con elementi dell'interfaccia utente per l'ordinamento, il filtro e l'impaginazione (tramite will_paginate). Il plugin will_paginate gestisce correttamente la persistenza all'interno della pagina dei parametri di querystring.

Esiste un meccanismo automatico per aggiungere i parametri querystring a una route con nome oppure devo farlo manualmente? Molte ricerche su questo costrutto apparentemente semplice mi hanno lasciato all'oscuro.

modificare

Alcune delle sfide:

  1. Se ho due parametri querystring, bucket e ordinamento, come posso impostare un valore specifico su uno di questi in un link_to, preservando il valore corrente dell'altro? Per esempio:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Se ho più parametri di querystring, bucket e ordinamento e page_size e voglio impostare il valore su uno di questi, c'è un modo per includere "automaticamente" i nomi e i valori dei parametri rimanenti? Per esempio:

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



Risposte:


341

I documenti API su link_per mostrare alcuni esempi di aggiunta di stringhe di query a route con nome e stile vecchio. È questo che vuoi?

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

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

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

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
#=> <a href="https://stackoverflow.com/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,

è giusto. la nuova sintassi è `<% = link_to" Crea nota ", new_note_path (sender_id: @ user.id)%>`
gsumk

51

Se vuoi il modo rapido e sporco e non preoccuparti dell'attacco XSS, usa params.mergeper mantenere i parametri precedenti. per esempio

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

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

Altrimenti, controlla questa risposta: params.merge e cross site scripting


56
Non farlo, ti apre agli attacchi xss.
Daniel Nill,

1
@ DanielNill- Puoi spiegarci
Yarin

3
@Yarin C'è una buona spiegazione a questa domanda .
James,

5
@Yarin La stampa arbitraria dei parametri nella pagina che sono stati inviati dall'utente (e non necessariamente ripuliti) consente a qualcuno di collegarsi al tuo sito con un collegamento che codifica Javascript. Quel Javascript viene quindi stampato nella pagina ed esegue, potenzialmente rubando i cookie o facendo attività nefaste. Rails è normalmente abbastanza bravo a pulire le cose stampate nella pagina, ma è meglio prevenire che curare
Peter Nixey,

24

Se vuoi mantenere i parametri esistenti e non esporsi agli attacchi XSS, assicurati di pulire l'hash dei parametri, lasciando solo i parametri che la tua app può inviare:

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

 

Se lo usi in più punti, pulisci i parametri nel controller:

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

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

4

Nel caso in cui si desideri passare un blocco, ad esempio, per un pulsante glyphicon, come nel seguente:

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

Quindi il passaggio dei parametri di querystrings 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 %>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.