0

私はRubyonRailsを使用して、ユーザーが大学のコース、モジュール、およびそれらに登録している学生を管理できるようにするプログラムを作成しています。

現在、Application.rbとCourseModules.rbの2つのクラスがあります。

Application.rbは、ユーザーとのインターフェイスに使用しているクラスです。現在、次のようになっています。

コード:

class Application
# To change this template use File | Settings | File Templates.
require './courseModules.rb'
def initialize
  main_menu
end

=begin
  def navigateTo(what)
  what.new(v).display
  mainMenu
  end
=end

def main_menu
  puts "What would you like to do?
      1: Add module to a scheme
      2: Remove module from a scheme
      3: Query modules
      4: Modify module
      5: Register a student on a scheme
      6: Remove a student from a scheme
      7: Register a student on a module
      8: Remove a student from a module"
  case gets.strip
    when "1"
      CourseModules.add_module
    when "2"
      CourseModules.removeModuleFromScheme
    when "3"
      navigateTo CourseModules
    when "4"
      navigateTo CourseModules
    when "5"
      navigateTo Student
    when "6"
      navigateTo Student
    when "7"
      navigateTo Student
    end
  end
  Application.new
end

そしてCourseModules.rbは私がすべての仕事をしているところです-それは現在このように見えます:

コード:

class CourseModules
# To change this template use File | Settings | File Templates.
   @@moduleScheme = nil
   @@moduleYear = nil
   #@moduleTitle = ""
   @noOfModulesInScheme = 0

   def self.moduleYear
     @@moduleYear
   end

   def initialize(v)
     @val = v
   end
   # Set and get the @val object value
   def set (v)
     @val = v
   end
   def get
     return @val
   end


# Attempt at add_module method on 21/08/2012 at 16:30
def self.add_module
  schemes = {}
  scheme_exists = false
  add_another_scheme = true
  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"
   else
     scheme_exists = false
     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
     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

 print "Add another scheme? "
 ask_if_user_wants_to_add_another_scheme = gets
 if !(ask_if_user_wants_to_add_another_scheme.chop == "y" or ask_if_user_wants_to_add_another_scheme.chop == "yes")
   add_another_scheme = false
 end
 puts @schemes

end

 while add_another_module
   print "Enter scheme name: "
   scheme_name = gets
   schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false

   if !scheme_exists
     print "Enter module name: "
     module_name = gets
     schemes[scheme_name.chop] = module_name.chop
     puts "Scheme #{scheme_name.chop} with module #{module_name} has been added to the system"
   else
     scheme_exists = false
     puts "This scheme has already been added"
     puts "Enter module name: "
     module_name = gets
     schemes[scheme_name.chop] = module_name.chop
     puts "Scheme #{scheme_name.chop} with module #{module_name} has been added to the system"
   end

   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.chop == "yes")
     add_another_module = false
   end
 end
 puts schemes
end

end

現在、Application.rbからプログラムを実行すると、メニューが表示され、オプション1:「モジュールをスキームに追加する」を選択します。

次に、スキーム名を入力するように求められます。これを行うと、スキームがシステムに追加されたことを示す行が表示されます。

次に、モジュールの名前を入力するように求められます。次に、別のモジュールを入力するかどうかを尋ねられます。「y」または「yes」と入力すると、別のモジュールの名前を入力できます。ただし、「n」または「y」または「yes」以外の何かを入力すると、プログラムがクラッシュし、コンソールでいくつかのエラーが発生します。

これらのエラーの最初のものは次のように述べています。

add_module': undefined methodApplication:Class(NoMethodError)のmain_menu'に

ライン上:

Application.main_menu

の中に

def self.add_module

私のCourseModules.rbクラスのメソッド。

ユーザーが別のモジュールを追加するかどうかを尋ねられたときに「n」または「y」または「yes」以外の何かを入力すると、プログラムのメインメニューに戻る必要があります。

誰かが私がここで間違っていることを知っていますか?どうすれば正しくできますか?

4

1 に答える 1

1

Applicationクラスのインスタンスメソッドとして定義されているときに、Application.main_menuを使用してクラスメソッドを呼び出そうとしているようです。そのため、undefined_methodを取得しています。main_menuメソッド定義にselfを追加してみてください。

class Application
  def self.main_menu
    ....
  end
end

コメントに基づいて修正します。

initializeメソッドも変更する必要があります。これに変更することでそうすることができます

class Application
  def initialize
    self.class.main_menu
  end

  ...

end

initializeメソッドのmain_menuの前にselfを追加することで、新しいApplicationクラスを作成するときに新しいメソッドを初期化することをinitializeに指示しているだけです。このメソッドをクラスメソッドにすることをinitializeに通知するには、クラスにも渡す必要があります。これが理にかなっていることを願っています。

于 2012-08-22T11:42:31.077 に答える