我在Ruby中有一个方法,需要一个API URL:
request_url = "http://api.abc.com/v3/avail?rev=#{ENV['REV']}&key=#{ENV['KEY']}&locale=en_US¤cyCode=#{currency}&arrivalDate=#{check_in}&departureDate=#{check_out}&includeDetails=true&includeRoomImages=true&room1=#{total_guests}"
我想将其格式化为更具可读性。应该采取论据。
request_url = "http://api.abc.com/v3/avail?
&rev=#{ENV['REV']}
&key=#{ENV['KEY']}
&locale=en_US
¤cyCode=#{currency}
&arrivalDate=#{check_in}
&departureDate=#{check_out}
&includeDetails=true
&includeRoomImages=true
&room1=#{total_guests}"
但当然还有突破。我尝试了heredoc,但我想让它在一条线上。
答案 0 :(得分:4)
我不希望通过加入字符串来构建URI查询,因为这可能导致未正确编码的URL(请参阅URI中的characters that need to be encoded列表)。
Ruby on Rails中有Hash#to_query
方法可以完全满足您的需要,并确保参数正确地进行URI编码:
base_url = 'http://api.abc.com/v3/avail'
arguments = {
rev: ENV['REV'],
key: ENV['KEY'],
locale: 'en_US',
currencyCode: currency,
arrivalDate: check_in,
departureDate: check_out,
includeDetails: true,
includeRoomImages: true,
room1: total_guests
}
request_url = "#{base_url}?#{arguments.to_query}"
答案 1 :(得分:2)
您可以使用数组并加入字符串:
request_url = [
"http://api.abc.com/v3/avail?",
"&rev=#{ENV['REV']}",
"&key=#{ENV['KEY']}",
"&locale=en_US",
"¤cyCode=#{currency}",
"&arrivalDate=#{check_in}",
"&departureDate=#{check_out}",
"&includeDetails=true",
"&includeRoomImages=true",
"&room1=#{total_guests}",
].join('')
更简单,您可以使用the %W
array shorthand notation,这样您就不必写出所有引号和逗号:
request_url = %W(
http://api.abc.com/v3/avail?
&rev=#{ENV['REV']}
&key=#{ENV['KEY']}
&locale=en_US
¤cyCode=#{currency}
&arrivalDate=#{check_in}
&departureDate=#{check_out}
&includeDetails=true
&includeRoomImages=true
&room1=#{total_guests}
).join('')
编辑:当然,spickermann makes a very good point上面提供了更好的方法来专门针对网址完成此操作。但是,如果您没有构建网址并且只使用字符串,则上述方法应该可以正常工作。
答案 2 :(得分:0)
您可以使用行继续运算符在Ruby中扩展字符串。例如:
request_url = "http://api.abc.com/v3/avail?" \
"&rev=#{ENV['REV']}" \
"&key=#{ENV['KEY']}"