2010-04-23 21 views
175

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

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

Editar

Algunos de los desafíos:

  1. Si tengo dos parámetros de cadena de consulta, cubo & clasificación, ¿cómo establecer un valor específico a uno de estos en un link_to, preservando al mismo tiempo el valor actual del otro? Por ejemplo:

    <%= link_to "0", profiles_path(:bucket => '0', :sorting=>??) %> 
    
  2. Si tengo varios parámetros de cadena de consulta, cubo & clasificación & tamaño_página, y quiero establecer el valor a uno de estos, es que hay una manera de 'automáticamente' incluye 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 plugin will_paginate gestiona su variable de página y otras variables de cadena de consulta de forma automática. No parece haber un elemento UI automático para administrar el tamaño de página. Si bien he visto código para crear una lista de selección 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á relacionada con ocultar/mostrar este elemento de UI basado en la existencia/inexistencia 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 de QS (es decir, página, segmento, clasificación), en lugar de tener que incluirlas por nombre en el enlace_a.

+0

posible duplicado de [manera-más eficiente para pasar los rieles params hash de t o ruta nombrada] (http://stackoverflow.com/questions/4559916/more-efficient-way-to-pass-the-rails-params-hash-to-named-route) – random

+1

muy relacionado: http: // stackoverflow .com/questions/2124862/link-to-send-parameters-along-with-the-url-and-grab-them-on-target-page –

Respuesta

283

El API docs on link_to muestran algunos ejemplos de la adición de cadenas de consulta a ambas rutas con nombre y estilo antiguo. ¿Es esto lo que quieres?

link_to también puede producir enlaces con anclas o cadenas de consulta:

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

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

link_to "Nonsense search", searches_path(:foo => "bar", :baz => "quux") 
#=> <a href="/searches?foo=bar&amp;baz=quux">Nonsense search</a> 
+1

Tu respuesta me ayudó a resolver # 1: <% = link_to "0" , profiles_path (: bucket => '0',: sorting => params [: sorting])%>. Gracias. – craig

47

si desea que la manera rápida y sucia y no se preocupe por ataque XSS, el uso params.merge para mantener los parámetros anteriores. p.ej.

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

véase: https://stackoverflow.com/a/4174493/445908

De lo contrario, marque esta respuesta: params.merge and cross site scripting

+45

No hagas esto, te abre a los ataques xss. –

+0

@ DanielNill- ¿Puedes explicarme – Yarin

+3

@Yarin? Hay una explicación bastante buena en [esta pregunta] (http://stackoverflow.com/questions/12271218/params-merge-and-cross-site-scripting). – James

22

Si desea mantener params existentes y no se exponga a ataques XSS, asegúrese de limpiar el hash params, dejando sólo los parametros que su aplicación puede estar enviando:

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

 

Si lo usa en varios lugares, limpiar los parametros en el controlador:

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

# view 
<%= link_to 'Link', @params.merge(per_page: 20) %> 
3

En caso de que quiera pasar en un bloque, por ejemplo, para un botón glyphicon, como en el siguiente:

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

luego pasando cadenas de consulta params podría lograrse 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 %> 
Cuestiones relacionadas