使用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"",结果出现了 "无效中断 "的错误,所以我想可以把它加到最下面。
https://github.com/codyalvarez/starwars-api
问题从以下几个方面开始
input = gets.chomp.to_i
你把输入的文本转换成一个整数。如果用户输入'exit',则会出现 to_i
方法将其转换为0。之后,你将基于 (input-1)
. 因此 退出-作为最后的比较,你问的是 -1 == 'exit'
,当然这是一个例外。
如果你想保持这种IMO怪异的处理用户输入的方式,你必须检查是否有 -1
来找出用户是否输入了一个非整数值。当然,这意味着你的程序也会退出,如果用户输入了类似于 你好,梅兰妮阿姨!.