Dodaj parametry zapytania do link_to

214

Trudno mi dodawać parametry zapytania do link_to UrlHelper. Mam na przykład widok indeksu, który zawiera elementy interfejsu użytkownika do sortowania, filtrowania i paginacji (przez will_paginate). Wtyczka will_paginate poprawnie zarządza trwałością parametrów zapytania w obrębie strony.

Czy istnieje automatyczny mechanizm dodawania parametrów zapytania do nazwanej trasy, czy muszę to robić ręcznie? Wiele badań nad tym z pozoru prostym konstruktem pozostawiło mnie bez pojęcia.

Edytować

Niektóre wyzwania:

  1. Jeśli mam dwa parametry zapytania, wiadro i sortowanie, w jaki sposób ustawić konkretną wartość na jeden z nich w link_to, zachowując bieżącą wartość drugiego? Na przykład:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Jeśli mam wiele parametrów zapytania, wiadra i sortowania oraz wielkości strony i chcę ustawić wartość na jeden z nich, czy istnieje sposób „automatycznego” włączenia nazw i wartości pozostałych parametrów? Na przykład:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. Wtyczka will_paginate automatycznie zarządza zmienną strony i innymi zmiennymi zapytania. Wygląda na to, że nie ma automatycznego elementu interfejsu użytkownika do zarządzania rozmiarem strony. Chociaż widziałem kod do tworzenia listy wybranych rozmiarów stron, wolę mieć do tego elementy A (takie jak SO). Część tego wyzwania jest związana z nr 2, część dotyczy ukrywania / pokazywania tego elementu interfejsu użytkownika na podstawie istnienia / nieistnienia rekordów. Mówiąc inaczej, chcę dołączyć linki o rozmiarze strony tylko wtedy, gdy istnieją rekordy do strony. Ponadto wolę automatycznie dołączać inne zmienne QS (tj. Stronę, segment, sortowanie), zamiast umieszczać je według nazwy w link_to.

Craig
źródło
1
blisko spokrewnione: stackoverflow.com/questions/2124862/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

341

Dokumenty API na link_to pokazują kilka przykładów dodawania kwerendy do tras nazwanych i oldstyle. Czy to jest to, czego chcesz?

link_to może również tworzyć linki z kotwicami lub ciągami zapytań:

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
źródło
1
Twoja odpowiedź pomogła mi rozwiązać nr 1: <% = link_to "0", profile_path (: bucket => '0',: sorting => params [: sorting])%>. Dzięki.
craig
to prawda. nowa składnia to `<% = link_to" Utwórz notatkę ", new_note_path (sender_id: @ user.id)%>`
gsumk 12.09.19
51

Jeśli chcesz szybkiego i brudnego sposobu i nie martw się atakiem XSS, użyj, params.mergeaby zachować poprzednie parametry. na przykład

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

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

W przeciwnym razie sprawdź tę odpowiedź: params.merge i skrypty między witrynami

Siwei Shen 申思维
źródło
56
Nie rób tego, otwiera cię to na ataki xss.
Daniel Nill
1
@ DanielNill - Czy możesz wyjaśnić
Yarin
3
@Yarin Na to pytanie można znaleźć całkiem dobre wyjaśnienie .
James
5
@Yarin Arbitralne drukowanie parametrów na stronie przesłanych przez użytkownika (i niekoniecznie oczyszczonych) pozwala komuś na link do Twojej witryny za pomocą linku kodującego Javascript. Javascript jest następnie drukowany na stronie i wykonuje się, potencjalnie wykradając pliki cookie lub wykonując niecne zadania. Railsy zwykle są całkiem dobre w czyszczeniu rzeczy drukowanych na stronie, ale lepiej być bezpiecznym niż przepraszać
Peter Nixey,
24

Jeśli chcesz zachować istniejące parametry i nie narażać się na ataki XSS, wyczyść skrót parametrów, pozostawiając tylko parametry, które może wysyłać Twoja aplikacja:

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

 

Jeśli używasz go w wielu miejscach, wyczyść parametry w kontrolerze:

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

# view
<%= link_to 'Link', @params.merge(per_page: 20) %>
Greg Funtusov
źródło
4

Jeśli chcesz przekazać blok, powiedzmy, dla przycisku glifikonu, jak poniżej:

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

Następnie przekazywanie parametrów querystring można osiągnąć poprzez:

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