2010-04-23 5 views
175

J'ai du mal à ajouter des paramètres de chaîne de requête à link_to UrlHelper. J'ai une vue d'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.Ajout de paramètres de chaîne de caractères à lier à

Existe-t-il un mécanisme automatique pour ajouter les paramètres de la chaîne de requête à un itinéraire donné, ou dois-je le faire manuellement? Un grand nombre de recherches sur cette construction apparemment simple m'a laissé désemparé.

Modifier

Certains des défis:

  1. Si j'ai deux paramètres querystring, seau & tri, comment définir une valeur spécifique à l'un de ces derniers dans une link_to, tout en préservant la valeur actuelle de l'autre? Par exemple:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>??) %> 
    
  2. Si je dispose de plusieurs paramètres querystring, seau & tri & page_size, et je veux définir la valeur à l'un d'entre eux, est-il un moyen de « automatiquement » comprennent les noms et les valeurs les 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 sa variable de page et d'autres variables querystring automatiquement. 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érerais avoir des éléments pour cela (comme SO). Une partie de ce défi est liée à # 2, une partie est liée à cacher/montrer cet élément d'interface utilisateur basé sur l'existence/non-existence d'enregistrements. Dit d'une autre manière, je veux seulement inclure des liens de taille de page s'il y a des enregistrements à la page. De plus, je préfère inclure automatiquement les autres variables QS (c'est-à-dire la page, le compartiment, le tri), plutôt que d'avoir à les inclure par nom dans le link_to.

+0

double possible de [manière plus efficace pour passer le hachage Rails t o route nommée] (http://stackoverflow.com/questions/4559916/more-efficient-way-to-pass-the-rails-params-hash-to-named-route) – random

+1

étroitement liée: http: // stackoverflow .com/questions/2124862/lien-a-envoyer-paramètres-a-la-url-et-grab-them-sur-cible-page –

Répondre

283

Le API docs on link_to montrent quelques exemples d'ajout querystrings à deux voies nommées et oldstyle. c'est ce que tu veux?

link_to peut également produire des liens avec les ancres ou les 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> 
+1

Votre réponse m'a aidé à résoudre # 1: <% = link_to "0" , profiles_path (: bucket => '0',: tri => params [: tri])%>. Merci. – craig

47

Si vous voulez la façon rapide et sale et ne vous inquiétez pas attaque XSS, utilisez params.merge pour maintenir 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 and cross site scripting

+45

Ne faites pas cela, cela vous ouvre aux attaques xss. –

+0

@ DanielNill- Pouvez-vous expliquer – Yarin

+3

@Yarin Il ya une très bonne explication à [cette question] (http://stackoverflow.com/questions/12271218/params-merge-and-cross-site-scripting). – James

22

Si vous voulez garder params existants et ne pas vous exposer à des attaques XSS, assurez-vous de nettoyer le hachage params, laissant seulement les params que votre application peut enverrez:

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

 

Si vous l'utilisez dans plusieurs endroits, nettoyez les params dans le contrôleur:

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

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

Si vous voulez passer dans un bloc, par exemple, pour un bouton glyphicon, comme dans les domaines suivants:

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

Puis, passant querystrings params 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 %> 
Questions connexes