2011-07-02 34 views
17

Tôi có chuỗi url gọi lại params[:callback] và tôi cần nối chuỗi truy vấn "&result=true" và chuyển hướng người dùng. Cách tốt hơn tôi thấy để làm điều này là sử dụng addressable nhưng tôi nghĩ rằng mã là quá lớn đối với nhiệm vụ như thế này đặc biệt là khi chúng ta đang nói về ruby:Nối chuỗi truy vấn vào url

callback = Addressable::URI.parse(params[:callback]) 
query = callback.query_values 
query[:result] = 'true' 
callback.query_values = query 

redirect_to callback.to_s 

Có một cách thanh lịch hơn nhận được kết quả tương tự như đoạn này?

Trả lời

8
  • nếu bạn không cần trình kiểm soát URL mà bạn có thể làm điều này (trông giống một chút bẩn):
    
    url = params[:callback] 
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true' 
    
  • nếu không bạn phải sử dụng một trong hai một số thư viện bên ngoài (như Addressable) hoặc mô-đun URI từ thư viện chuẩn
+1

yeah, nó trông bẩn. Nhìn vào mã của tôi bằng cách sử dụng Addressable là có anyway mã này có thể ngắn hơn? – MIchel

-2

Bạn có thể thử với merge

request.parameters.merge({:result => true})

này sẽ thêm yo tham số ur cho những thông số đã được xác định.

+0

OP có URL trong một biến. Đó không phải là URL yêu cầu hiện tại – Gareth

4
callback.query_values = callback.query_values.merge({"result" => "true"}) 
+0

Câu trả lời của Mauna bên dưới là tốt hơn vì 'callback.query_values' có thể trả về' nil', không trả lời 'hợp nhất' – FeifanZ

0

Tôi nghĩ bạn khá gần tối ưu. bạn có thể nghiền nát một hoặc hai dòng, nhưng nó không thực sự giúp bạn đạt được điều gì.

callback = Addressable::URI.parse(params[:callback]) 
callback.query_values = callback.query_values.merge {:results => 'true' } 
redirect_to callback.to_s 

Nếu gọi lại luôn nằm trong ứng dụng của bạn, bạn có thể có một số tùy chọn khác với mức độ mát mẻ khác nhau, nhưng bạn không chỉ rõ trường hợp đó có đúng hay không.

8

Tôi không thể cập nhật chủ đề này vì bất kỳ giải pháp nào không hoạt động.

Lý do là, có vẻ như là callback.query_values trả về Nil nếu url thực tế không có giá trị truy vấn hiện tại.

Vì vậy nếu bạn có url như: http://www.foo.comhttp://www.foo.com?bar=1 bạn nên sử dụng đoạn mã sau:

url = "http://www.foo.com" # or params[:callback] obviously. :) 

callback = Addressable::URI.parse(url) 
callback.query_values = (callback.query_values || {}).merge({ 
    result: true 
}) 

redirect_to callback.to_s 

Cheers.

0

năm sau, tôi tìm thấy giải pháp tốt hơn cho vấn đề này.

Lấy giá trị từ super đầu tiên, sau đó làm bất cứ chỉnh chúng ta không cần sử dụng Addressable

def url_for(options={}) 
    val = super 
    if params[:locale].present? 
     parsed = Addressable::URI.parse(val) 
     query_array = parsed.query_values(Array) || [] 
     query_array << ['locale', params[:locale]] 
     parsed.query_values = query_array 
     val = parsed.to_s 
    end 
    val 
end 
Các vấn đề liên quan