2010-09-21 24 views
41

Tôi có một cơ sở tìm kiếm điển hình trong ứng dụng của mình, trả về danh sách kết quả có thể được phân trang, sắp xếp, xem với giá trị records_per_page khác nhau, v.v. tham số trong chuỗi truy vấn. Một ví dụ đơn giản:Đường ray: Bảo quản các tham số chuỗi truy vấn GET trong link_to

/search?q=test&page=2 

Bây giờ nói rằng tôi cần phải hiển thị một tập hợp các liên kết mà đặt giá trị records_per_page đến 10, 20, 30. Mỗi liên kết phải bao gồm các thông số truy vấn hiện có, có thể là một bộ rất dài, cộng với thông số per_page mới.

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

Có cách nào dễ dàng để thực hiện điều đó chỉ với link_to helper hoặc tôi cần phải phân tích và tạo lại chuỗi truy vấn từ yêu cầu trước bằng cách nào đó?

+0

bản sao có thể có của [Thêm thông số chuỗi truy vấn vào liên kết \ _to] (http://stackoverflow.com/questions/2695538/add-querystring-parameters-to-link-to) –

Trả lời

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

Điều này bổ sung thêm một số tham số 'phụ' như 'controller' và' action'. – kikito

+13

Nhưng bạn có thể tránh điều đó bằng cách sử dụng 'request.query_parameters' thay vì' request.parameters' – kikito

+1

sử dụng 'deep_merge' nếu tham số truy vấn của bạn yêu cầu mảng được liên kết hoặc hàm băm lồng nhau – twnaing

2

Bạn chỉ có thể ném các phần tử của mã băm params tại số link_to. Giống như

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

gì về

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

?

+1

Điều này trông giống như những gì tôi đang tìm kiếm . Tuy nhiên nó không được chấp nhận trong Rails 3. link_to 'link', request.parameters.merge ({: per_page => 20}) làm việc cho tôi. – Vincent

+1

Đường ray 3.2+ cách để làm điều này là gì? – coudron

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

Một hơi muộn tôi biết ..

Nếu bạn sử dụng điều này như một cách để lọc kết quả tìm kiếm có một cái nhìn tại helper của tôi :)

automagicly này loại bỏ tất cả trống và các tham số không cần thiết và thêm lớp "đã chọn" nếu tất cả các tham số mới của nó đã được đặt.

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 

Bạn có thể sau đó chỉ cần sử dụng này theo quan điểm của bạn:

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

Hoặc trong trường hợp của bạn:

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

này hoạt động nếu các liên kết bạn đang chế biến không được trao cho bạn bởi request.params.

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

Nếu bạn muốn giữ params hiện có và không tiếp xúc với chính mình để tấn công XSS, hãy chắc chắn để làm sạch băm params, chỉ để lại params rằng ứng dụng của bạn có thể được gửi:

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

 

Nếu bạn sử dụng nó ở nhiều nơi, làm sạch params trong bộ điều khiển:

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

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

Cách đơn giản nhất để kết hợp các tham số mới với các tham số truy vấn và NOT với tất cả các tham số (bao gồm cả các tham số thu được thông qua đường dẫn) là hợp nhất với yêu cầu .query_parameters

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

Nếu bạn kết thúc với chuỗi truy vấn sao chép các thông số con đường, ví dụ ?action=index&controller=products&foo=bar thay vì ?foo=bar.

+0

Đây phải là câu trả lời được chấp nhận. – Agis

Các vấn đề liên quan