30 votes

Comment ajouter des paramètres à l'URL courante dans rails

J'ai une logique où je permets le tri sur le prix et la pertinence. Je le fais en passant des paramètres au contrôleur. Mon URL a un paramètre - 'sort' qui peut avoir une valeur - 'price_lowest' ou 'default'. Les liens ressemblent à ceci :

<a href="<%= request.fullpath + '&sort=price_lowest' %>">lowest prices</a> | 
<a href="<%= request.fullpath + '&sort=default' %>">relevance</a>

Le problème avec le code ci-dessus est qu'il "ajoute" des paramètres et ne les "remplace" pas. Je veux remplacer la valeur du paramètre &sort= sans ajouter une nouvelle valeur. Par exemple, je ne veux pas que :

../&sort=price_lowest&sort=price_lowest&sort=default

Avec la logique actuelle, j'obtiens le comportement ci-dessus. Avez-vous des suggestions ?

67voto

lulalala Points 3895

Afin de préserver les paramètres, j'ai fait ceci :

<%= link_to 'Date', params.merge(sort: "end_date") %>

Cependant l'url sera moche.

UPDATE

Pour Rails 5, utilisez :

<%= link_to 'Date', request.params.merge(sort: "end_date") %>

33voto

idlefingers Points 15957

Si vous n'avez besoin que d'un seul paramètre cgi et que vous voulez rester sur la même page, c'est très simple à réaliser :

<%= link_to "lowest prices", :sort => "price_lowest" %>

Cependant, si vous en avez plusieurs, il faut une certaine logique pour conserver les anciens. Ce serait probablement mieux extrait à une aide, mais essentiellement vous pourriez faire quelque chose comme ceci pour garder les autres paramètres

<%= link_to "lowest prices", :sort => "price_lowest", :other_param => params[:other] %>

Les itinéraires nommés ne vous seront vraiment utiles ici que si vous devez vous rendre sur une autre page.

13voto

scarver2 Points 2605

Si un chemin d'accès n'est pas passé à la fonction link_to la méthode actuelle params sont supposés. Dans Rails 3.2, il s'agit de la méthode la plus élégante pour ajouter ou modifier des paramètres dans une URL :

<%= link_to 'lowest prices', params.merge(sort: 'end_date') %>
<%= link_to 'relevance', params.merge(sort: 'default') %>

params est un hash Ruby. L'utilisation de merge permet soit d'ajouter une clé, soit de remplacer la valeur d'une clé. Si vous passez nil comme valeur d'une clé, il supprimera cette paire clé/valeur du hachage.

<%= link_to 'relevance', params.merge(sort: nil) %>

Citer :

1voto

Alex Freshmann Points 362

Ma solution fonctionnelle sur Rails 3.1 bien sûr, c'est un code dur, et il faut le remanier.

modèle d'article

  def self.get(field,value)
    where(field=>value)
  end

contrôleur des articles

@items=Item.all
 if params[:enabled]
  @items=@items.get(:enabled, params[:enabled])
end
if params[:section]
  @items=@items.get(:section_id, params[:section])
end

Aide pour les articles

def filter_link(text, filters={}, html_options={})
  trigger=0
  params_to_keep = [:section, :enabled]
  params_to_keep.each do |param|
    if filters[param].to_s==params[param] && filters[param].to_s!="clear" || filters[param].to_s=="clear"&&params[param].nil?
      trigger=1
    end
    if filters[param]=="clear"
      filters.delete(param)
    else
      filters[param]=params[param] if filters[param].nil?
    end
  end
  html_options[:class]= 'current' if trigger==1
  link_to text, filters, html_options
end

articles index.html.erb

<%= filter_link 'All sections',{:section=>"clear"} %>
<% @sections.each do |section| %>
   <%= filter_link section.title, {:section => section} %>
<% end %>

<%= filter_link "All items", {:enabled=>"clear"} %>
<%= filter_link "In stock", :enabled=>true %>
<%= filter_link "Not in stock", :enabled=>false %>

0voto

SaucyK Points 837

Ce n'est pas tout à fait la réponse à la question que vous posez, mais avez-vous pensé à utiliser la fonction Gemme triée pour gérer votre logique de tri et afficher les liens ?

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