web-dev-qa-db-fra.com

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

J'ai des difficultés à ajouter des paramètres de chaîne de requête à link_to UrlHelper. J'ai une vue Index, par exemple, qui contient 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 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, ou dois-je le faire manuellement? De nombreuses recherches sur cette construction apparemment simple m'ont laissé sans idée.

Éditer

Certains des 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 sur 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, seau et tri et taille de page, et que je souhaite définir la valeur sur l'un de ceux-ci, 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 les 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 le code pour créer une liste de sélection de tailles de page, je préférerais avoir des éléments A pour cela (comme SO). Une partie de ce défi est liée au n ° 2, une autre partie consiste à masquer/afficher cet élément de l'interface utilisateur en fonction de l'existence/non-existence d'enregistrements. En d'autres termes, je souhaite uniquement inclure des liens de la taille d'une page s'il existe des enregistrements vers une page. De plus, je préfère inclure automatiquement les autres variables QS (c'est-à-dire page, compartiment, tri) plutôt que de les inclure par leur nom dans link_to.

195
craig

Les documents d'API sur link_to montrent quelques exemples d'ajout de chaînes de requête aux itinéraires nommés et à l'ancien style. 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="/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>
320
Fred

Si vous voulez la méthode rapide et sale et ne vous inquiétez pas des attaques XSS, utilisez params.merge pour 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, cochez cette réponse: params.merge et script intersite

50

Si vous souhaitez conserver les paramètres existants et ne pas vous exposer aux attaques XSS, veillez à 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) %>
24
Greg Funtusov

Si vous souhaitez passer dans un bloc, par exemple pour un bouton glyphicon, procédez comme suit:

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

Ensuite, passer des paramètres de chaîne de requête pourrait ê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 %>
4
zakelfassi