2011-11-07 30 views
8

Tôi có một URL trong một chuỗi. Cách súc tích nhất để thêm một số thông số vào nó là gì?Xây dựng các URL tùy ý tăng dần trong Ruby on Rails

ví dụ:

base = 'http://example.com' 
uri1 = some_magical_method(base, :p1 => 'v1') # => http://example.com/?p1=v1 
uri2 = some_magical_method(uri1, :p2 => 'v2') # => http://example.com/?p1=v1&p2=v2 
uri3 = some_magical_method(uri2, :p3 => nil) # => http://example.com/?p1=v1&p2=v2 

1) Trong Ruby?

2) Trong Rails?

Trả lời

16

Trong Rails, nơi ActiveSupport khả dụng, cách dễ nhất là tạo băm, sau đó gọi #to_query trên đó.

>> params = {} 
>> params[:foo] = "bar" 
>> params[:baz] = "bang" 
>> params.to_query 
=> "baz=bang&foo=bar" 

Trong đồng bằng Ruby, cùng áp dụng, nhưng bạn sẽ cần phải viết bộ mã hóa bản thân:

require 'cgi' 
def to_query(hsh) 
    hsh.map {|k, v| "#{k}=#{CGI::escape v}" }.join("&") 
end 

params = {} 
params[:foo] = "bar" 
params[:baz] = "bang" 

to_query params 
=> "baz=bang&foo=bar" 
+0

Có một cuộc gọi duy nhất đó cũng sẽ chăm sóc nén chuỗi truy vấn từ URL, sau đó thực hiện những gì bạn đã nói, sau đó trả lại URL gốc bằng chuỗi truy vấn mới? – user1015384

+0

Đặt cược tốt nhất của bạn sẽ là sử dụng [URI :: parse] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html#method-c-parse) để chia URL thành các phần thành phần của nó, sau đó bạn có thể lắp ráp lại nó với các phần bạn quan tâm. –

+0

Câu hỏi này chỉ trả lời một khía cạnh của câu hỏi: tạo chuỗi truy vấn. Làm thế nào để nối nó? – schmijos

5
require 'open-uri' 

def params_to_query(params) 
    params.map {|p, v| "#{p}=#{URI.escape(v.to_s)}"}.join('&') 
end 

def append_url(url, params = {}) 
    uri = URI.parse(url) 
    uri.query = uri.query.nil? ? params_to_query(params) : [uri.query, params_to_query(params)].join('&') unless params.empty? 
    uri.to_s 
end 

puts append_url('http://example.com', {:query => 'my_example'} # "http://example.com?query=my_example" 
+0

Cảm ơn nhưng tôi phải rõ ràng hơn. Tôi muốn biết những gì có thể với việc sử dụng các thư viện tích hợp của Ruby và Rails. – user1015384

+0

Trong Rails bạn chỉ cần thay 'params_to_query (params)' bằng 'params.to_query'. Các logic khác cũng giống nhau. –