我正在Ruby中编写一个课程管理程序,允许用户在一个方案中添加/删除模块。
目前,我的程序将允许用户添加模块,但当我尝试删除它们时,我被告知它们不存在。
我用来添加模块的方法是:
def self.add_module
# schemes = {}
scheme_exists = false
add_another_scheme = true
# module_exists = false
add_another_module = true
while add_another_scheme
print "Enter scheme name: "
scheme_name = gets
$schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false
if !scheme_exists
$schemes[scheme_name.chop] = []
puts "Scheme #{scheme_name.chop} has been added to the system"
elsif
scheme_exists = true
puts "This scheme has already been added"
end
while add_another_module
print "Enter module name: "
module_name = gets
$schemes[scheme_name.chop].include?(module_name.chop) ? true : $schemes[scheme_name.chop] << module_name.chop
# puts "Module #{module_name.chop} has been added to #{scheme_name.chop}"
# 22/08/2012 at 14:15 Now need to read in each module's unique identifier and year it belongs to
print "Enter module ID: "
$module_ID =gets
$schemes[scheme_name.chop].include?($module_ID.chop) ? true : $schemes[scheme_name.chop] << $module_ID.chop
$schemes.has_key?($module_ID.chop) ? module_exists = true : module_exists = false
print "Enter the academic year to which the module belongs: "
module_year = gets
$schemes[scheme_name.chop].include?(module_year.chop) ? true : $schemes[scheme_name.chop] << module_year.chop
if !$module_exists
$schemes[$module_ID.chop] = []
puts "Module #{$module_ID.chop} : #{module_name.chop} has been added to #{scheme_name.chop} for the year #{module_year}"
elsif
$module_exists = true
puts "A module with this ID has already been added to the scheme, please check if the module already exists, or choose another ID "
else
# puts "Module #{module_name.chop}, #{module_ID.chop} has been added to #{scheme_name.chop} for the year #{module_year}"
end
# puts "Module #{module_name.chop}, #{module_ID.chop} has been added to #{scheme_name.chop}"
print "Add another module? "
ask_if_user_wants_to_add_another_module = gets
if(ask_if_user_wants_to_add_another_module.chop == "y" or ask_if_user_wants_to_add_another_module == "yes")
add_another_scheme = false
else if(ask_if_user_wants_to_add_another_module.chop != "y" or ask_if_user_wants_to_add_another_module != "yes")
Application.main_menu
end
end
end
我尝试删除模块的方法是:
def self.remove_module
print "Which scheme would you like to remove a module from? "
scheme_name = gets
$schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false
if !scheme_exists
$schemes[scheme_name.chop] = []
puts "Scheme #{scheme_name.chop} doesn't exist"
else
scheme_exists = true
puts "Which module would you like to remove from #{scheme_name.chop}?"
$module_ID = gets
if !$module_exists
$schemes[$module_ID.chop] = []
puts "Module #{$module_ID.chop} : does not exist in #{scheme_name.chop} "
else
module_exists = true
puts "Module #{$module_ID.chop} has been removed from #{scheme_name.chop} "
# puts "Module #{module_name.chop}, #{module_ID.chop} has been added to #{scheme_name.chop} for the year #{module_year}"
end
end
end
当我运行程序时,会显示一个菜单,然后我选择将模块添加到方案中,该方案调用第一个方法。我按照以下步骤操作:
这告诉我,当我调用第一个方法(添加模块)时,我在变量中存储的数据刚刚在我调用第二个方法(删除模块)时被丢弃。
如何确保此信息不会丢失?是否有我需要设置和连接程序的数据库,或者我是否需要使用会话和会话变量?或者它是完全不同的东西?
非常感谢任何帮助!
答案 0 :(得分:1)
(不是答案。)
我在阅读您的代码时遇到了问题。例如:
$schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false
# Did you mean:
scheme_exists = $schemes.has_key?(scheme_name.chop)
和
if !scheme_exists
$schemes[scheme_name.chop] = []
puts "Scheme #{scheme_name.chop} doesn't exist"
else
scheme_exists = true
# ...
为什么将scheme_exists
设为true?您刚刚测试过不是是真的。
你的“方案存在”看起来很像你的“模块存在”,如果它们是相同的,那么它们就是一样的。有很多chop
ping正在进行中,也许你应该在输入后切断并在其他地方停止切割 - 它似乎容易出错并且会增加很多噪音。
总的来说,我发现很难在不实际执行代码的情况下推理您的代码。我建议重构,让你的内容“大声”读出,就像你想要解决的问题一样。
我们也不知道是否还有其他事情涉及$schemes
。你是否“应该”使用数据库取决于完全你的目标,你的约束,你如何运行应用程序等等。你也可以序列化YAML,写一个纯文本文件,所有各种各样的东西。
如果您重新启动/重新运行应用程序,您显然会丢失所有未保留的数据。如果你一直呆在应用程序中,那么代码或你的假设可能是错误的,但是对于某人来说,查看代码并确定它的结构和命名方式是一项艰巨的任务。