2012-06-19 18 views
7

Tôi có biểu mẫu tìm kiếm, có nhiều tùy chọn, Đã gửi đến tuyến đường có yêu cầu Nhận. URL giống như sau:Cách xóa thông số giá trị trống khỏi chuỗi truy vấn

http://localhost:3000/restaurants/search?utf8=%E2%9C%93&city=&cuisine=&number_of_people=&query=hello 

với nhiều thông số khác. Tôi muốn làm cho nó sạch hơn một cái gì đó giống như loại bỏ tất cả các params được trống.

một cái gì đó như thế này: (Về cơ bản loại bỏ tất cả các params là trống)

http://localhost:3000/restaurants/search?query=hello 

Làm thế nào để làm điều này?

Một cách có thể được sử dụng

CGI::parse("foo=bar&bar=foo&hello=hi") 

Cung cấp cho bạn

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]} 

người dùng chuyển hướng đầu tiên trên ở giữa hành động và trong đó ở giữa kiểm tra hành động mà params là trống và loại bỏ chúng và sau đó cuối cùng chuyển hướng anh ta trên hành động thực tế của tìm kiếm. Nhưng điều này nghe có vẻ rất xấu hổ. Làm thế nào tôi có thể làm điều này một cách tốt hơn?

+0

Tại sao là những giá trị trống vấn đề? –

+0

@SergioTulentsev Để làm cho các url trở nên sạch sẽ hơn .. –

+0

@SergioTulentsev Biểu mẫu tìm kiếm của nó. Khi người dùng gửi biểu mẫu. Tất cả đều xuất hiện. –

Trả lời

1

Chỉ cần với đồng bằng ol' ruby ​​...

require 'uri' 
a = "http://localhost:8080/path/search?foo=&bar=&baz=2&bat=thing" 
u = URI.parse(a) 
params = u.query.split("&").select {|param| param =~ /=./}.join("&") 
# Returns "baz=2&bat=thing" 
+0

không hoạt động cho việc này: http: // localhost: 3000/nhà hàng/tìm kiếm? Utf8 =% E2% 9C% 93 & city = & cuisine = & number_of_people = & booking% 5Bdate_of_booking% 5D = 19 + June + 2012 & booking% 5Btime_of_booking% 281i% 29% 5D = & booking% 5Btime_of_booking% 282i% 29% 5D = & booking% 5Btime_of_booking% 283i% 29% 5D = & đặt phòng% 5Btime_of_booking% 284i% 29% 5D = & booking% 5Btime_of_booking% 285i% 29% 5D = & booking% 5Btime_of_booking% 287i% 29% 5D = -2 & truy vấn = & commit = Gửi –

+0

hoạt động tốt ở đây. –

+1

Tôi đã làm 'params.select! {| K, v | v.present?} 'có cùng kết quả, nhưng tôi không biết cách làm cho URL đáp ứng được làm sạch. – juanpastas

0

tôi sẽ đề nghị, nếu chỉ nhìn vào ruby ​​cũ đồng bằng, một gsub đơn giản có thể là đủ:

url.gsub(/[^\?&=]+=(?:&|$)/, '') 

Lưu ý: đây có thể để lại dấu và ở cuối, có thể được cắt bằng

url.chomp('&') 
2

Giải pháp của tôi là vô hiệu hóa đầu vào trống và bia cts:

$('form').submit (e) -> 
    $(@).find('select,input').map((i, e) -> e.disabled = !$(e).val()) 

Về loại bỏ utf8 tôi thấy this. Vì vậy, tôi nên tiếp tục gửi nó.

Làm tất cả điều này trên máy chủ dẫn đến một yêu cầu bổ sung khi sử dụng redirect_to, vì vậy tôi thích sử dụng mã phía máy khách.

1

Trong phương pháp điều khiển của bạn, hãy gọi remove_empty_query_params

Sau đó, như một phương pháp riêng:

def remove_empty_query_params 
    # Rewrites /projects?q=&status=failing to /projects?status=failing 
    require 'addressable/uri' 
    original = request.original_url 
    parsed = Addressable::URI.parse(original) 
    return unless parsed.query_values.present? 
    queries_with_values = parsed.query_values.reject { |_k, v| v.blank? } 
    if queries_with_values.blank? 
     parsed.omit!(:query) 
    else parsed.query_values = queries_with_values 
    end 
    redirect_to parsed.to_s unless parsed.to_s == original 
    end