Ajouter des paramètres de chaîne de requête à link_to

214

J'ai du mal à ajouter des paramètres de chaîne de requête à link_to UrlHelper. J'ai une vue Index, par exemple, qui a des éléments d'interface utilisateur pour le tri, le filtrage et la pagination (via will_paginate). Le plugin will_paginate gère correctement la persistance intra-page des paramètres de la chaîne de requête.

Existe-t-il un mécanisme automatique pour ajouter les paramètres de chaîne de requête à une route nommée donnée, ou dois-je le faire manuellement? De nombreuses recherches sur cette construction apparemment simple m'ont laissé sans aucune idée.

Éditer

Quelques défis:

  1. Si j'ai deux paramètres de chaîne de requête, compartiment et tri, comment définir une valeur spécifique pour l'un d'eux dans un link_to, tout en préservant la valeur actuelle de l'autre? Par exemple:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Si j'ai plusieurs paramètres de chaîne de requête, bucket & sorting & page_size, et que je souhaite définir la valeur sur l'un d'entre eux, existe-t-il un moyen d'inclure "automatiquement" les noms et les valeurs des paramètres restants? Par exemple:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. Le plugin will_paginate gère automatiquement sa variable de page et d'autres variables de chaîne de requête. Il ne semble pas y avoir d'élément d'interface utilisateur automatique pour gérer la taille de la page. Bien que j'ai vu du code pour créer une liste de tailles de page, je préfère avoir des éléments A pour cela (comme SO). Une partie de ce défi est liée à # 2, une partie est liée au masquage / affichage de cet élément d'interface utilisateur basé sur l'existence / la non-existence d'enregistrements. Autrement dit, je ne veux inclure des liens de taille de page que s'il y a des enregistrements sur la page. De plus, je préfère inclure automatiquement les autres variables QS (c'est-à-dire la page, le bucket, le tri), plutôt que de les inclure par nom dans le link_to.

craig
la source
1
étroitement liés: stackoverflow.com/questions/2124862/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

341

Les documents de l'API sur link_to montrent quelques exemples d'ajout de chaînes de requête aux routes nommées et anciennes. c'est ce que tu veux?

link_to peut également produire des liens avec des ancres ou des chaînes de requête:

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
la source
1
Votre réponse m'a aidé à résoudre # 1: <% = link_to "0", profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Merci.
craig
c'est juste. la nouvelle syntaxe est `<% ​​= link_to" Create Note ", new_note_path (sender_id: @ user.id)%>`
gsumk
51

Si vous voulez une méthode rapide et sale et ne vous inquiétez pas des attaques XSS, utilisez params.mergepour conserver les paramètres précédents. par exemple

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

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

Sinon, vérifiez cette réponse: params.merge et cross site scripting

Siwei Shen 申思维
la source
56
Ne faites pas cela, cela vous ouvre aux attaques xss.
Daniel Nill
1
@ DanielNill- Pouvez-vous expliquer
Yarin
3
@Yarin Il y a une assez bonne explication à cette question .
James
5
@Yarin L'impression arbitraire de paramètres dans la page qui ont été soumis par l'utilisateur (et pas nécessairement nettoyés) permet à quelqu'un de créer un lien vers votre site avec un lien qui code Javascript. Ce Javascript est ensuite imprimé dans la page et s'exécute, pouvant voler des cookies ou effectuer des tâches néfastes. Rails est normalement assez bon pour nettoyer les trucs imprimés sur la page, mais il vaut mieux prévenir que guérir
Peter Nixey
24

Si vous souhaitez conserver les paramètres existants et ne pas vous exposer aux attaques XSS, assurez-vous de nettoyer le hachage des paramètres, en ne laissant que les paramètres que votre application peut envoyer:

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

 

Si vous l'utilisez à plusieurs endroits, nettoyez les paramètres du contrôleur:

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

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

Dans le cas où vous souhaitez passer dans un bloc, disons, pour un bouton glyphicon, comme dans le texte suivant:

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

Ensuite, le passage des paramètres des chaînes de requête peut être accompli par:

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