Frage Fügen Sie querystring-Parameter zu link_to hinzu


Ich habe Querystring-Parameter zu link_to UrlHelper schwierig hinzugefügt. Ich habe zum Beispiel eine Indexansicht, die über UI-Elemente zum Sortieren, Filtern und Paginieren verfügt (via will_paginate). Das Plugin will_paginate verwaltet die persistierende Querystring-Parameter innerhalb der Seite korrekt.

Gibt es einen automatischen Mechanismus zum Hinzufügen der Querystring-Parameter zu einer angegebenen 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 & Sortierung, wie setze ich einen bestimmten Wert auf einen von diesen in einem link_to, 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 & Sortierung & Seitengröße, und möchte ich den Wert auf einen dieser Werte setzen, gibt es eine Möglichkeit, die Namen und Werte der übrigen Parameter automatisch einzubeziehen? Beispielsweise:

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


180
2018-04-23 01:01


Ursprung


Antworten:


Das API-Dokumente auf link_to zeigen einige Beispiele für das Hinzufügen von Querystrings zu Routen mit Namen und Oldstyle. Ist das was du willst?

link_to  kann auch Verknüpfungen mit Ankern oder Abfragezeichenfolgen erzeugen:

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>

294
2018-04-23 03:18



Wenn Sie den schnellen und schmutzigen Weg wollen und sich nicht um XSS-Angriffe sorgen, verwenden Sie params.merge vorherige Parameter beibehalten z.B.

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

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

Andernfalls überprüfen Sie diese Antwort: params.merge und cross site scripting 


48
2018-04-01 09:28



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

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

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

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

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

23
2018-05-10 07:41



Für den Fall, dass Sie einen Block übergeben möchten, z. B. für einen Glyphon-Button, wie im Folgenden:

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

Dann könnte das Passieren von Querystrings Params durchgeführt werden durch:

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

3
2017-08-29 12:36