Fügen Sie link_to Querystring-Parameter hinzu

214

Ich habe schwierig, Querystring-Parameter zu link_to UrlHelper hinzuzufügen. Ich habe zum Beispiel eine Indexansicht, die UI-Elemente zum Sortieren, Filtern und Paginieren enthält (über will_paginate). Das will_paginate-Plugin verwaltet die Intra-Page-Persistenz von Querystring-Parametern korrekt.

Gibt es einen automatischen Mechanismus zum Hinzufügen der Querystring-Parameter zu einer angegebenen benannten Route oder muss ich dies manuell tun? Eine Menge Forschung über dieses scheinbar einfache Konstrukt hat mich ahnungslos gemacht.

Bearbeiten

Einige der Herausforderungen:

  1. Wenn ich zwei Querystring-Parameter habe, Bucket & Sorting, wie kann ein bestimmter Wert in einem link_to auf einen dieser Werte gesetzt werden, während der aktuelle Wert des anderen beibehalten wird? Beispielsweise:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Wenn ich mehrere Querystring-Parameter habe, Bucket & Sorting & Page_size, und ich den Wert auf einen dieser Werte setzen möchte, gibt es eine Möglichkeit, die Namen und Werte der verbleibenden Parameter 'automatisch' einzuschließen? Beispielsweise:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. Das will_paginate-Plugin verwaltet seine Seitenvariable und andere Querystring-Variablen automatisch. Es scheint kein automatisches UI-Element zum Verwalten der Seitengröße zu geben. Während ich Code zum Erstellen einer ausgewählten Liste von Seitengrößen gesehen habe, hätte ich lieber A-Elemente dafür (wie SO). Ein Teil dieser Herausforderung bezieht sich auf # 2, ein Teil auf das Ausblenden / Anzeigen dieses UI-Elements basierend auf der Existenz / Nichtexistenz von Datensätzen. Anders gesagt, ich möchte nur Links in Seitengröße einfügen, wenn Datensätze auf der Seite vorhanden sind. Außerdem ziehe ich es vor, die anderen QS-Variablen (dh Seite, Bucket, Sortierung) automatisch einzuschließen, anstatt sie namentlich in link_to aufnehmen zu müssen.

Craig
quelle
1
eng verwandt: stackoverflow.com/questions/2124862/…
Ciro Santilli 14 冠状 病 六四 事件 法轮功

Antworten:

341

Die API-Dokumente auf link_to zeigen einige Beispiele für das Hinzufügen von Querystrings zu benannten und alten Routen. Ist das was du willst?

link_to kann auch Links mit Ankern oder Abfragezeichenfolgen erzeugen:

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>
Fred
quelle
1
Ihre Antwort hat mir geholfen, # 1 zu lösen: <% = link_to "0", profile_path (: Bucket => '0' ,: sorting => params [: sorting])%>. Vielen Dank.
Craig
Dies ist richtig. Die neue Syntax lautet "<% = link_to" Create Note ", new_note_path (sender_id: @ user.id)%>"
gsumk
51

Wenn Sie schnell und schmutzig vorgehen möchten und sich keine Gedanken über XSS-Angriffe machen möchten params.merge, behalten Sie die vorherigen Parameter bei. z.B

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

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

Überprüfen Sie andernfalls diese Antwort: params.merge und Cross Site Scripting

Siwei Shen 申思维
quelle
56
Tun Sie dies nicht, es öffnet Sie für xss-Angriffe.
Daniel Nill
1
@ DanielNill- Kannst du erklären
Yarin
3
@ Yarin Es gibt eine ziemlich gute Erklärung für diese Frage .
James
5
@Yarin Durch willkürliches Drucken von Parametern in die Seite, die vom Benutzer übermittelt (und nicht unbedingt bereinigt) wurden, kann jemand mit einem Link, der Javascript codiert, auf Ihre Website verlinken. Dieses Javascript wird dann auf die Seite gedruckt und ausgeführt, wobei möglicherweise Cookies gestohlen oder schändliche Aufgaben ausgeführt werden. Rails ist normalerweise ziemlich gut darin,
Peter Nixey
24

Wenn Sie vorhandene Parameter beibehalten und sich keinen XSS-Angriffen aussetzen möchten, müssen Sie den Parameter-Hash bereinigen und nur die Parameter belassen, die Ihre App senden kann:

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

 

Wenn Sie es an mehreren Stellen verwenden, bereinigen Sie die Parameter im Controller:

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

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

Wenn Sie beispielsweise einen Block für eine Glyphicon-Schaltfläche übergeben möchten, wie im Folgenden beschrieben:

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

Das Übergeben von Querystrings-Parametern könnte dann erreicht werden durch:

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