2013-04-03 34 views
7

Tôi có url này:Xóa dấu "?" từ một chuỗi

http://localhost:3000/blog/posts?locale=en 

Tôi có một helper để loại bỏ ?locale=en của url:

def url_without_locale_params(url) 
    uri = URI url 
    params = Rack::Utils.parse_query uri.query 
    params.delete 'locale' 
    uri.query = params.to_param 
    uri.to_s 
end 

Với helper này tôi nhận được url này http://localhost:3000/blog/posts?. Tôi muốn xóa dấu vết ?.

Kết quả phải là http://localhost:3000/blog/posts.

+2

Phần URL sau khi dấu chấm hỏi được gọi là 'chuỗi truy vấn'. –

+0

Câu trả lời đúng cho điều này là gán 'nil' cho' params' như Mike Campbell nói. –

+0

Thật dễ hiểu tại sao bạn nên thử sử dụng thao tác chuỗi để xoa bóp URL được trả về, nhưng khi sử dụng một lớp được thiết kế để quản lý nội dung đó, thật sự tốt để tận dụng các tính năng của nó. URI không phải là công cụ URI tốt nhất/đầy đủ tính năng nhất cho Ruby. Nhìn vào [Addressable :: URI] (https://github.com/sporkmonger/addressable) nếu bạn muốn một cái gì đó toàn diện hơn. –

Trả lời

3

Những câu trả lời vậy, đến nay tất cả coi chuỗi riêng của mình. Những gì bạn đang thực sự làm là nói với nó rằng nó có params "". Nếu bạn làm cho nó nil nếu params.to_param == "" bạn sẽ không gặp phải vấn đề đó.

def url_without_locale_params(url) 
    uri = URI url 
    params = Rack::Utils.parse_query uri.query 
    params.delete 'locale' 
    uri.query = params.to_param.blank? ? nil : params.to_param 
    uri.to_s 
end 

điều gì đó như vậy sẽ thực hiện thủ thuật. Lý do cho điều này là ngay cả với một chuỗi rỗng, URI giả định có một cái gì đó để được nối, vì vậy nó đặt ban đầu ? trên.

+0

Cuối cùng, ai đó đã đưa ra câu trả lời đúng! +1! –

+0

Đó là chính xác, phản hồi này là tốt nhất. Xin lỗi về sự chậm trễ! – hyperrjas

9

Sử dụng #gsub:

uri = "http://localhost:3000/blog/posts?locale=en" 
uri.gsub(/\?.*/, '') 
    #=> "http://localhost:3000/blog/posts" 
+0

Cảm ơn bạn, nó hoạt động tốt: D – hyperrjas

8

String#chomp là một khả năng.

1.9.3p392 :002 > "foobar?".chomp("?") 
=> "foobar" 

Phương pháp cuối cùng sẽ được

def url_without_locale_params(url) 
    uri = URI url 
    params = Rack::Utils.parse_query uri.query 
    params.delete 'locale' 
    uri.query = params.to_param 
    uri.to_s.chomp("?") 
end 
+0

Điều này chỉ hoạt động nếu '?' Là ký tự cuối cùng của chuỗi. Nó không loại bỏ các ký tự sau đó. –

+3

Thực tế, đây là những gì anh ta hỏi. Nếu bạn đọc câu hỏi của mình và xem phương thức, anh ta đã phân tích cú pháp truy vấn bằng 'Rack :: Utils', sau đó anh ta tạo chuỗi truy vấn bằng' to_param' và đây là nơi dấu '?' Được nối thêm. –

+1

Bạn hoàn toàn đúng! Trong trường hợp đó, câu trả lời của bạn là tốt nhất - upvoting. –

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