rails multiple link_to_if link_to link example ruby-on-rails parameters routing helpers

ruby-on-rails - multiple - rails link_to controller action



Rails: Preservando los parĂ¡metros de la cadena de consulta GET en link_to (8)

Tengo una función de búsqueda típica en mi aplicación que devuelve una lista de resultados que pueden paginarse, ordenarse, verse con un valor diferente de registro_per_página, etc. Cada una de estas opciones está controlada por parámetros en la cadena de consulta. Un ejemplo simplificado:

/search?q=test&page=2

Ahora diga que necesito mostrar un conjunto de enlaces que establecen el valor de records_per_page a 10, 20, 30. Cada enlace debe incluir los parámetros de consulta existentes, que pueden ser un conjunto muy largo, más un nuevo parámetro per_page.

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

¿Hay una manera fácil de hacerlo con solo link_to helper o necesito analizar y reproducir la cadena de consulta de la solicitud anterior de alguna manera?


Esto funciona si request.params no le proporciona los enlaces que está procesando.

require ''rack/utils'' require ''uri'' def modify_query url, options={} uri = URI(url) query_hash = Rack::Utils.parse_query(uri.query) query_hash.merge!(options) uri.query = Rack::Utils.build_query(query_hash) uri.to_s end puts modify_query(''/search?q=test&page=2&per_page=10'', ''per_page'' => 20) puts modify_query(''/search?q=test&page=2'', ''per_page'' => 30) # Outputs # /search?q=test&page=2&per_page=20 # /search?q=test&page=2&per_page=30


La forma más sencilla de combinar los nuevos parámetros con los parámetros de consulta y NO con todos los parámetros (incluidos los obtenidos a través de la ruta) es fusionar con request.query_parameters

link_to ''Search'', search_path(request.query_parameters.merge({ per_page: 20 }))

De lo contrario, terminará con cadenas de consulta que duplican los parámetros de la ruta, por ejemplo ?action=index&controller=products&foo=bar lugar de ?foo=bar .


Qué pasa

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

?


Si desea mantener los parámetros existentes y no exponerse a los 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) %>


Solo puedes lanzar elementos del hash params en link_to . Me gusta

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


Un poco tarde lo se ..

Si está utilizando esto como una forma de filtrar los resultados de búsqueda, eche un vistazo a mi ayudante :)

Esto elimina automáticamente todos los parámetros en blanco e innecesarios y agrega la clase "seleccionada" si todos sus nuevos parámetros ya estaban establecidos.

def search_to s, args={} selected = 0 args.each do |k, v| selected = selected + 1 if params[k] == v.to_s || ( params[k].nil? && v.blank? ) end if @search_params_base.nil? @search_params_base = request.parameters.clone @search_params_base.delete(:action) @search_params_base.delete(:controller) @search_params_base.delete(:page) @search_params_base.delete_if{|k, v| v.nil? || v.blank?} @search_params_base.delete(:utf8) if @search_params_base[:keywords].nil? end search_params = @search_params_base.merge(args) search_params.delete_if{|k, v| v.nil? || v.blank?} link_to s, search_path + ''?'' + search_params.to_param, :class => selected == args.length ? ''selected'' : nil end

Entonces puedes usar esto en tu vista:

search_to ''$80 to $110'', :price => 80..110

O en tu caso:

search_to ''30 per page'', :page => params[:page], :per_page => 30


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


link_to ''Link'', request.query_parameters.merge({:per_page => 20})