在Ruby中整理长字符串

时间:2016-05-18 03:16:20

标签: ruby-on-rails ruby

我在Ruby中有一个方法,需要一个API URL:

  request_url = "http://api.abc.com/v3/avail?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 = "http://api.abc.com/v3/avail?
  &rev=#{ENV['REV']}
  &key=#{ENV['KEY']}
  &locale=en_US
  &currencyCode=#{currency}
  &arrivalDate=#{check_in}
  &departureDate=#{check_out}
  &includeDetails=true
  &includeRoomImages=true
  &room1=#{total_guests}"

但当然还有突破。我尝试了heredoc,但我想让它在一条线上。

3 个答案:

答案 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",
  "&currencyCode=#{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
  &currencyCode=#{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']}"