2010-09-21 24 views
41

Uygulamamda tipik bir arama özelliğim var; bu, paginated, sıralanmış, farklı bir records_per_page değeriyle görüntülenebilir, sonuçların listesini döndürür. Bu seçeneklerin her biri tarafından kontrol edilir. sorgu dizesindeki parametreler. Bir basitleştirilmiş bir örnek:Raylar: GET sorgu dizesi parametrelerini link_to içinde koruma

/search?q=test&page=2 

Şimdi 10 records_per_page değeri bağlantıları, 20 kümesini görüntülemek için gereken söylüyorlar, 30. Her bir bağlantı, çok uzun bir dizi olabilir varolan sorgu parametreleri içermelidir artı yeni bir per_page parametresi.

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

sadece yardımcı link_to ya da ben ayrıştırmak ve bir şekilde daha önceki isteğinden sorgu dizesi çoğaltmak gerek bunu yapmanın kolay bir yolu var mı?

+0

olası yinelemesi [Bağlantıya eklemek için querystring parametreleri ekle \ _to] (http://stackoverflow.com/questions/2695538/add-querystring-parameters-to-link-to) –

cevap

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

Bu, "controller" ve "action" gibi bazı 'extra' parametreleri ekler. – kikito

+13

Ancak 'request.query_parameters' yerine 'request.query_parameters' yerine' request.parameters' – kikito

+1

' sorgulama parametreleriniz ilişkili diziler veya nested hash – twnaing

2

params karma öğesinin öğelerini link_to adresinde atayabilirsiniz.

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

Ne

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

yaklaşık gibi mi?

+1

Bu, aradığım şey gibi görünüyor . Ancak Rails 3'te kullanımdan kaldırıldı. Link_to 'link', request.parameters.merge ({: per_page => 20}) benim için çalıştı. – Vincent

+1

Rayları 3.2 + yolu bunun için nedir? – coudron

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

Biraz geç biliyorum ..

senin arama sonuçları my yardımcı :)

Bu automagicly tüm boş kaldırır ve bir göz süzmek için bir yol olarak bu kullanılıyorsa Gereksiz paramlar ve yeni parametrelerin tümü önceden ayarlanmışsa "seçili" sınıfı ekleyin.

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 
Ardından sadece görünümde kullanabilirsiniz

:

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

Senin durumunda:

Eğer işliyoruz bağlantılar size verilen değil, bu işleri
search_to '30 per page', :page => params[:page], :per_page => 30 
1

request.params tarafından.

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 
3

uygulamanızın gönderme olabilir sadece params bırakarak parametreler karma temizlendiğinden emin olun, XSS saldırılarına kendinizi maruz mevcut params tutmak değil isterseniz:

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

 

Eğer birden fazla yerde kullanmak ise kontrolörün içinde params temizlemek:

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

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

Yeni parametrelerin sorgu parametreleriyle birleştirilmesinin en basit yolu ve tüm parametrelerle (yoldan elde edilenler de dahil olmak üzere), talebi ile birleştirmek.query_parameters

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

Aksi takdirde sorgu dizeleri örnek ?action=index&controller=products&foo=bar yerine ?foo=bar için, yol parametrelerini çoğaltma ile bitirmek.

+0

kullanıyorsa, bunun kabul edilmesi gerekir. – Agis