【发布时间】:2020-05-15 01:03:11
【问题描述】:
使用 SWAPI 构建了一个星球大战 API。我想分解我的代码,以便满足以下条件:
-在你的程序中的任何时候,如果用户输入了无效的输入,程序不应该崩溃并提示用户重试
-除非用户明确选择退出,否则程序不应随时退出
def menu
puts "Please select from a category below:"
StarwarsCLI::Category.all.each_with_index {|cat, i|
puts "#{i + 1}. #{cat.name.capitalize} "
}
input = gets.chomp.to_i
category = StarwarsCLI::Category.all[input-1]
StarwarsCLI::APIService.get_items(category)
items = Module.const_get("StarwarsCLI::#{category.name.capitalize}").all
if (input-1) == 0
return list_people
elsif (input-1) == 1
return list_planets
elsif (input-1) == 2
return list_films
elsif (input-1) == 3
return list_species
elsif (input-1) == 4
return list_vehicles
elsif (input-1) == 5
return list_starships
elsif input == "exit"
exit
else
puts "Not a valid option, choose another."
return menu
end
end
添加行后
elsif input == "exit"
exit
else
puts "Not a valid option, choose another."
return menu
我的代码不再运行,我的错误消息是
Traceback (most recent call last):
3: from bin/starwars:5:in `<main>'
2: from /mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/command_line_interface.rb:9:in `run'
1: from /mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/command_line_interface.rb:21:in `menu'
/mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/api_manager.rb:17:in `get_items': undefined method `url' for nil:NilClass (NoMethodError)
如果有人介意解释到底出了什么问题,我真的可以使用一些帮助来运行此代码。
我尝试在第 17 行下添加一个 `break if input == "exit"' 并出现错误 "invalid break" 所以我虽然可以将其添加到底部
https://github.com/codyalvarez/starwars-api
【问题讨论】:
-
也许你可以先使用 begin-rescue 来防止它崩溃。
-
问题出现在您的
get_items方法中 - 您正在传递一个nilcat -
是时候了解
case语句,或者更好的是,将菜单选项映射到方法的哈希查找表。 -
@eightbithero :
input包含一个Integer。您不能将整数与字符串进行比较。
标签: ruby api command-line-interface