Rails: conservation des parameters de chaîne de requête GET dans link_to

J’ai une fonction de recherche typique dans mon application qui renvoie une liste de résultats pouvant être paginés, sortingés, visualisés avec une valeur records_per_page différente, etc. Chacune de ces options est contrôlée par des parameters de la chaîne de requête. Un exemple simplifié:

/search?q=test&page=2 

Maintenant, je dois afficher un ensemble de liens qui définissent la valeur records_per_page à 10, 20, 30. Chaque lien doit inclure les parameters de requête existants, qui peuvent être un ensemble très long, plus un nouveau paramètre per_page.

 /search?q=test&page=2& ... &per_page=10 /search?q=test&page=2& ... &per_page=20 /search?q=test&page=2& ... &per_page=30 

Existe-t-il un moyen simple de le faire avec link_to helper ou je dois parsingr et reproduire la chaîne de requête de la requête précédente d’une manière ou d’une autre?

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

La manière la plus simple de fusionner les nouveaux parameters avec les parameters de la requête et NON avec tous les parameters (y compris ceux obtenus via le chemin) est de fusionner avec request.query_parameters

 link_to 'Search', search_path(request.query_parameters.merge({ per_page: 20 })) 

Sinon, vous vous retrouvez avec des chaînes de requête dupliquant les parameters du chemin, par exemple ?action=index&controller=products&foo=bar au lieu de ?foo=bar .

Si vous souhaitez conserver les parameters existants et ne pas vous exposer aux attaques XSS, veillez à nettoyer le hachage des parameters, en ne laissant que les parameters que votre application peut envoyer:

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

Si vous l’utilisez à plusieurs endroits, nettoyez les parameters du contrôleur:

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

Vous pouvez simplement lancer des éléments du hachage de params sur link_to . Comme

 link_to "some_other_link", "/search", :page => params[:page] 

Qu’en est-il de

 <%= link_to 'Whatever', :overwrite_params => { :pear_page => 20 } %> 

?

Cela fonctionne si les liens que vous traitez ne vous sont pas donnés par request.params.

 require 'rack/utils' require 'uri' def modify_query url, options={} uri = URI(url) query_hash = Rack::Utils.parse_query(uri.query) query_hash.merge!(options) uri.query = Rack::Utils.build_query(query_hash) uri.to_s end puts modify_query('/search?q=test&page=2&per_page=10', 'per_page' => 20) puts modify_query('/search?q=test&page=2', 'per_page' => 30) # Outputs # /search?q=test&page=2&per_page=20 # /search?q=test&page=2&per_page=30 

Un peu tard je sais ..

Si vous utilisez ceci comme un moyen de filtrer les résultats de recherche, jetez un coup d’œil à mon assistant 🙂

Cela supprime automatiquement tous les parameters vides et inutiles et ajoute la classe “selected” si tous ses nouveaux parameters sont déjà définis.

 def search_to s, args={} selected = 0 args.each do |k, v| selected = selected + 1 if params[k] == v.to_s || ( params[k].nil? && v.blank? ) end if @search_params_base.nil? @search_params_base = request.parameters.clone @search_params_base.delete(:action) @search_params_base.delete(:controller) @search_params_base.delete(:page) @search_params_base.delete_if{|k, v| v.nil? || v.blank?} @search_params_base.delete(:utf8) if @search_params_base[:keywords].nil? end search_params = @search_params_base.merge(args) search_params.delete_if{|k, v| v.nil? || v.blank?} link_to s, search_path + '?' + search_params.to_param, :class => selected == args.length ? 'selected' : nil end 

Vous pouvez alors simplement utiliser ceci dans votre vue:

 search_to '$80 to $110', :price => 80..110 

Ou dans votre cas:

 search_to '30 per page', :page => params[:page], :per_page => 30