45 votes

Rails: Préservation des paramètres de chaîne de requête GET dans link_to

J'ai un typique moteur de recherche dans mon application qui renvoie une liste de résultats qui peuvent être paginé, triés, vu avec un autre records_per_page valeur, etc. Chacune de ces options est contrôlé par les paramètres de la chaîne de requête. Un exemple simplifié:

/search?q=test&page=2

Maintenant dire que j'ai besoin d'afficher un ensemble de liens qui ensemble records_per_page valeur de 10, 20, 30. Chaque lien doit comprendre l'existant, les paramètres de la requête, qui peut être très long, en plus d'un nouveau per_page paramètre.

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

Est-il un moyen facile de le faire avec juste link_to helper ou j'ai besoin d'analyser et de reproduire la chaîne de requête à partir de la précédente demande en quelque sorte?

65voto

Vincent Points 5364
link_to 'Link', request.parameters.merge({:per_page => 20})

22voto

Olek Points 196
link_to 'Link', params.merge({:per_page => 20})

4voto

Greg Funtusov Points 505

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) %>
 

2voto

Reactormonk Points 7990

Vous pouvez simplement jeter les éléments du params hash à link_to . Comme

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

1voto

jordinl Points 3225

Qu'en est-il de

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

?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X