Ruby-节省用户输入

时间:2012-08-22 17:07:06

标签: ruby

我正在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

当我运行程序时,会显示一个菜单,然后我选择将模块添加到方案中,该方案调用第一个方法。我按照以下步骤操作:

  1. 输入方案名称 - 显示一条消息,说明该方案已添加到系统中
  2. 输入模块名称
  3. 输入模块ID
  4. 输入模块所属的学年 - 显示一条消息,说明该模块已添加到该年度的方案中
  5. 我被问到是否要添加另一个模块,所以我说是的
  6. 程序再次执行相同的步骤,但这次跳过第一步,并开始输入模块名称 - 当我再次执行这些步骤时,会显示另一条消息,指出第二个模块已添加到我第二次指定的任何年份的同一方案中
  7. 然后我被问到是否要添加另一个模块,我输入'n',然后返回到原始菜单。
  8. 这次我选择从方案中删除模块的选项
  9. 我被问到要删除模块的方案,所以我输入了我已添加模块的方案
  10. 然后我被问到要移除哪个模块,所以我输入了之前添加的模块之一,但我被告知该模块中不存在该模块。
  11. 这告诉我,当我调用第一个方法(添加模块)时,我在变量中存储的数据刚刚在我调用第二个方法(删除模块)时被丢弃。

    如何确保此信息不会丢失?是否有我需要设置和连接程序的数据库,或者我是否需要使用会话和会话变量?或者它是完全不同的东西?

    非常感谢任何帮助!

1 个答案:

答案 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,写一个纯文本文件,所有各种各样的东西。

如果您重新启动/重新运行应用程序,您显然会丢失所有未保留的数据。如果你一直呆在应用程序中,那么代码或你的假设可能是错误的,但是对于某人来说,查看代码并确定它的结构和命名方式是一项艰巨的任务。