Adicione parâmetros da string de consulta ao link_to

214

Estou dificilmente adicionando parâmetros de string de consulta ao link_to UrlHelper. Eu tenho uma exibição de índice, por exemplo, que possui elementos de interface do usuário para classificação, filtragem e paginação (via will_paginate). O plugin will_paginate gerencia a persistência intra-página dos parâmetros da string de consulta corretamente.

Existe um mecanismo automático para adicionar os parâmetros da string de consulta a uma rota nomeada, ou preciso fazer isso manualmente? Muita pesquisa sobre essa construção aparentemente simples me deixou sem noção.

Editar

Alguns dos desafios:

  1. Se eu tiver dois parâmetros de string de consulta, bucket e classificação, como definir um valor específico para um desses em um link_to, preservando o valor atual do outro? Por exemplo:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Se eu tiver vários parâmetros de string de consulta, bucket & sorting & page_size, e desejar definir o valor como um deles, existe uma maneira de incluir automaticamente os nomes e valores dos parâmetros restantes? Por exemplo:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. O plugin will_paginate gerencia sua variável de página e outras variáveis ​​de query query automaticamente. Não parece haver um elemento de interface do usuário automático para gerenciar o tamanho da página. Enquanto eu vi o código para criar uma lista selecionada de tamanhos de página, prefiro ter elementos A para isso (como SO). Parte desse desafio está relacionada ao item 2; parte está relacionada à ocultação / exibição deste elemento da interface do usuário com base na existência / não existência de registros. Dito de outra maneira, eu só quero incluir links de tamanho de página se houver registros para a página. Além disso, prefiro incluir automaticamente as outras variáveis ​​de QS (página, intervalo, classificação), em vez de incluí-las pelo nome no link_to.

craig
fonte
1
estreitamente relacionado: stackoverflow.com/questions/2124862/…
Ciro Santilli escreveu:

Respostas:

341

Os documentos da API no link_to mostram alguns exemplos de adição de cadeias de consulta a rotas nomeadas e antigas. É isso que voce quer?

link_to também pode produzir links com âncoras ou cadeias de consulta:

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
#=> <a href="https://stackoverflow.com/profiles/1#wall">Comment wall</a>

link_to "Ruby on Rails search", :controller => "searches", :query => "ruby on rails"
#=> <a href="https://stackoverflow.com/searches?query=ruby+on+rails">Ruby on Rails search</a>

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux")
#=> <a href="https://stackoverflow.com/searches?foo=bar&amp;baz=quux">Nonsense search</a>
Fred
fonte
1
Sua resposta me ajudou a resolver # 1: <% = link_to "0", profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Obrigado.
Craig
isto está certo. a nova sintaxe é `<% = link_to" Criar nota ", new_note_path (sender_id: @ user.id)%>`
gsumk
51

Se você deseja o caminho mais rápido e sujo e não se preocupa com o ataque XSS, use params.mergepara manter os parâmetros anteriores. por exemplo

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

consulte: https://stackoverflow.com/a/4174493/445908

Caso contrário, verifique esta resposta: params.merge e scripts entre sites

Siwei Shen 申思维
fonte
56
Não faça isso, ele abre para ataques xss.
Daniel Nill
1
@ DanielNill- você pode explicar
Yarin
3
@ Yarin Há uma boa explicação para essa pergunta .
James
5
@Yarin A impressão arbitrária de parâmetros na página que foi enviada pelo usuário (e não necessariamente limpa) permite que alguém crie um link para o seu site com um link que codifique Javascript. Esse Javascript é impresso na página e executado, potencialmente roubando cookies ou executando tarefas nefastas. Rails é normalmente muito bom em limpeza material que está impresso na página, mas é melhor prevenir do que remediar
Peter Nixey
24

Se você deseja manter os parâmetros existentes e não se expor a ataques XSS, limpe o hash dos parâmetros, deixando apenas os parâmetros que seu aplicativo pode enviar:

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

 

Se você o usar em vários locais, limpe os parâmetros no controlador:

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

# view
<%= link_to 'Link', @params.merge(per_page: 20) %>
Greg Funtusov
fonte
4

Caso você queira passar um bloco, digamos, para um botão de glifo, como no seguinte:

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

Em seguida, a passagem de parâmetros de querystrings pode ser realizada através de:

<%= link_to url_for(params.merge(my_params: "value")), class: "stuff" do %>
  <i class="glyphicon glyphicon-inbox></i> Nice glyph-button
<% end %>
zakelfassi
fonte