Agregar parámetros de cadena de consulta a link_to

214

Tengo dificultades para agregar parámetros de cadena de consulta a link_to UrlHelper. Tengo una vista de índice, por ejemplo, que tiene elementos de la interfaz de usuario para ordenar, filtrar y paginar (a través de will_paginate). El complemento will_paginate administra la persistencia dentro de la página de los parámetros de la cadena de consulta correctamente.

¿Existe un mecanismo automático para agregar los parámetros de la cadena de consulta a una determinada ruta con nombre, o debo hacerlo manualmente? Una gran cantidad de investigación sobre esta construcción aparentemente simple me ha dejado sin idea.

Editar

Algunos de los desafíos:

  1. Si tengo dos parámetros de cadena de consulta, depósito y clasificación, ¿cómo establezco un valor específico para uno de estos en un link_to, conservando el valor actual del otro? Por ejemplo:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>?? ) %>
  2. Si tengo múltiples parámetros de cadena de consulta, depósito y clasificación y tamaño de página, y quiero establecer el valor en uno de estos, ¿hay alguna forma de incluir 'automáticamente' los nombres y valores de los parámetros restantes? Por ejemplo:

    <%= link_to "0", profiles_path(:bucket => '0', [include sorting and page_size name/values here] ) %>
  3. El complemento will_paginate administra su variable de página y otras variables de cadena de consulta automáticamente. No parece haber un elemento de interfaz de usuario automático para administrar el tamaño de página. Si bien he visto código para crear una lista selecta de tamaños de página, prefiero tener elementos A para esto (como SO). Parte de este desafío está relacionado con el n. ° 2, parte está relacionado con ocultar / mostrar este elemento de IU basado en la existencia / no existencia de registros. Dicho de otra manera, solo quiero incluir enlaces de tamaño de página si hay registros en la página. Además, prefiero incluir automáticamente las otras variables QS (es decir, página, cubo, clasificación), en lugar de tener que incluirlas por nombre en link_to.

craig
fuente
1
estrechamente relacionado: stackoverflow.com/questions/2124862/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

341

Los documentos de API en link_to muestran algunos ejemplos de agregar cadenas de consulta a rutas con nombre y estilo antiguo. ¿Es esto lo que quieres?

link_to También puede producir enlaces con anclajes o cadenas 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
fuente
1
Su respuesta me ayudó a resolver # 1: <% = link_to "0", profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Gracias.
craig
esto es correcto. la nueva sintaxis es `<% = link_to" Crear nota ", new_note_path (sender_id: @ user.id)%>`
gsumk
51

Si desea la forma rápida y sucia y no se preocupa por el ataque XSS, use params.mergepara mantener los parámetros anteriores. p.ej

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

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

De lo contrario, verifique esta respuesta: params.merge y cross site scripting

Siwei Shen 申思维
fuente
56
No hagas esto, te abre a ataques xss.
Daniel Nill
1
@ DanielNill- ¿Puedes explicarlo
Yarin
3
@Yarin Hay una muy buena explicación a esta pregunta .
James
55
@Yarin La impresión arbitraria de parámetros en la página que ha enviado el usuario (y no necesariamente se ha limpiado) permite que alguien se vincule a su sitio con un enlace que codifica Javascript. Ese Javascript se imprime en la página y se ejecuta, potencialmente robando cookies o haciendo tareas nefastas. Rails normalmente es bastante bueno para limpiar cosas que están impresas en la página, pero es mejor prevenir que curar
Peter Nixey
24

Si desea mantener los parámetros existentes y no exponerse a ataques XSS, asegúrese de limpiar el hash de parámetros, dejando solo los parámetros que su aplicación puede enviar:

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

 

Si lo usa en varios lugares, limpie los parámetros en el controlador:

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

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

En caso de que quiera pasar un bloque, por ejemplo, para un botón de glifos, como se muestra a continuación:

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

Luego, pasar parámetros de cadenas de consulta se puede lograr a travé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
fuente