Как заставить мой API возвращать более одного значения в Ruby - PullRequest
0 голосов
/ 16 марта 2020

Мой CLI-проект работает почти правильно, однако возвращает только одно значение. Я хотел бы, чтобы моя программа возвращала несколько значений.

Вот код:

def display_info 
  puts "You'll love the following spots!"
  puts "********************************"
  @objects.each.with_index(1) {|brewery, index| puts "#{index}. #{brewery.name}"}  
  puts  "Please make a selection by index number for more information:"
  puts  "****************************************************"
  puts  "Type Quit to end. Type Menu to try another location."
  input = gets.strip.downcase
  if(input.to_i > 0)
    @brewery = @objects[input.to_i - 1] 
    puts "name: #{@brewery.name}"
    puts "street: #{@brewery.street}"
    puts "city: #{@brewery.city}"
    puts "phone: #{@brewery.phone}"
    puts "website_url: #{@brewery.website_url}"
    display_info
  elsif (input == "quit")
    quit 
  elsif (input == "menu")
    start
  else 
    puts "Ooops, please try again to get more info:"
    display_info
  end 
end

Вот результат ввода, если это поможет.

    Austin
You'll love the following spots!
********************************
1. Oasis Texas Brewing Company
Please make a selection by index number for more information:
****************************************************
Type Quit to end. Type Menu to try another location.
quit
Goodbye. Drink responsibly and enjoy.

Что я могу сделать вернуть более одного значения?

Вот источник этого кода. Это содержание.

    class Breweries::API

  def self.get_breweries(input)
    @breweries_hash = HTTParty.get("https://api.openbrewerydb.org/breweries?by_city=#{input}")
    return if @breweries_hash.empty? #empty array handle 
    breweries_obj = {
      name: @breweries_hash[1]["name"],
      street: @breweries_hash[3]["street"],
      city: @breweries_hash[4]["city"],
      phone: @breweries_hash[10]["phone"],
      website_url: @breweries_hash[11]["website_url"]
    }
    Breweries::HoppyCode.new(breweries_obj)
  end
end 

end 

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вам нужно разделить захваченную строку, используя gets, с символом. Вы должны попросить об этом в своем сообщении, обычно это будет запятая, возможно, окруженная пробелами.

Я выделил проблему в упрощенном сценарии, чтобы вы могли протестировать ее отдельно, что всегда хорошо, когда решение проблемы.

Обратите внимание на использование регулярных выражений между разделителями //, за которыми следует флаг i, чтобы указать, что сравнение должно быть без учета регистра.

# what you would receive when you type this in the console following your message
# and captured by the gets, in this case brewerie 1 and 3
input = "1, 3" 
#split by a comma preceded or followed or not by a space
breweries = input.split(/ *, */) 
breweries.each do |brewerie|
  if(brewerie.to_i > 0)
    # @brewery = @objects[input.to_i - 1] 
    puts "displaying info about #{brewerie}"
  elsif brewerie[/quit/i]
    # quit
  elsif brewerie[/menu/i]
    # start
  else 
    puts "Ooops, please try again to get more info:"
    # display_info
  end 
end

Который возвращает:

displaying info about 1
displaying info about 3
0 голосов
/ 16 марта 2020

Из того, что я понимаю, вы просите пользователя выбрать пивоварню из списка пивоварен. Когда они выбирают один, вы показываете его информацию им. Вместо этого вы можете отобразить список городов и позволить им выбрать город и выбрать все элементы @objects, где город соответствует

def display_info 
  arr_of_cities = []
  @objects.each{|element| arr_of_cities.push(element.city)}
  arr_of_cities.each.with_index(1) {|city, index| puts "#{index}.#{city}"}  
  puts  "Please make a selection by index number for more information:"
  puts  "****************************************************"
  puts  "Type Quit to end. Type Menu to try another location."
  input = gets.strip.downcase
  arr_of_breweries = @objects.where(city:arr_of_cities[input.to_i- 1])
  if(input.to_i > 0)
    arr_of_breweries.each.with_index(1) do |brewery,index|
    puts "#{index}"
    puts "name: #{@brewery.name}"
    puts "street: #{@brewery.street}"
    puts "city: #{@brewery.city}"
    puts "phone: #{@brewery.phone}"
    puts "website_url: #{@brewery.website_url}"
   end
    display_info
  elsif (input == "quit")
    quit 
  elsif (input == "menu")
    start
  else 
    puts "Ooops, please try again to get more info:"
    display_info
  end 
end

Надеюсь, это поможет. Я не использовал ruby некоторое время, так что мой синтаксис может быть немного отключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...