1

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. プログラムは再び同じ手順を実行しますが、今回は最初の手順をスキップし、モジュール名の入力から開始します。もう一度手順を実行すると、2 番目のモジュールが追加されたことを示す別のメッセージが表示されます。 2 回目に指定した年に同じスキーム
  7. 次に、別のモジュールを追加するかどうか尋ねられ、「n」と入力すると、元のメニューに戻ります。
  8. 今回は、スキームからモジュールを削除するオプションを選択します
  9. モジュールを削除するスキームを尋ねられたので、モジュールを追加したスキームを入力します
  10. 次に、削除するモジュールを尋ねられたので、以前に追加したモジュールの 1 つを入力しましたが、そのモジュールはスキームに存在しないと言われました。

これは、最初のメソッド (モジュールを追加するため) を呼び出したときに変数に保存したデータが、2 番目のメソッド (モジュールを削除するため) を呼び出したときに破棄されたことを示唆しています。

この情報が失われないようにするにはどうすればよいですか? プログラムをセットアップして接続する必要があるデータベースはありますか、それともセッションとセッション変数を使用する必要がありますか? それとも全く違うものですか?

どんな助けでも大歓迎です!

4

1 に答える 1

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_existstrueに設定するのですか?あなたはそれが真実ではないことをテストしました。

「スキームが存在する」は「モジュールが存在する」とよく似ています。同じ場合は、同じにします。多くのchopping が行われています。おそらく、入力後に切り刻み、それ以外の場所では切り捨てを停止する必要があります。エラーが発生しやすく、多くのノイズが追加されるようです。

全体として、実際にコードをステップスルーせずにコードを推論するのは難しいと思います。リファクタリングをお勧めします。解決しようとしている問題のように、物事を「大声で」読み上げます。

また、他に何かが触れているかどうかもわかりません$schemes。データベースを使用する必要があるかどうかは、目的、制約、アプリの実行方法などに完全に依存します。YAML をシリアル化したり、プレーン テキスト ファイルを作成したり、あらゆる種類のものを作成することもできます。

アプリを再起動/再実行すると、保持されていないすべてのデータが明らかに失われます。ずっとアプリ内にとどまっている場合は、コードまたは仮定が間違っている可能性がありますが、構造と名前が付けられているため、誰かがコードを調べて判断するのは面倒な作業です.

于 2012-08-22T17:23:06.223 に答える