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})