1

私は最初の Ruby on Rails プログラムを書いています。これは、大学でのコースの管理/編成、コースに参加する学生、および各コースに属するモジュールを支援するアプリケーションです。

私は現在、2 つのクラスを持っています。最初の Application と呼ばれるクラスは、ユーザーとのインターフェイスに使用しているもので、次のようになります。

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

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

  def mainMenu
    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.addModuleToScheme
  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

2 つ目は courseModules と呼ばれ、ユーザーが新しいコースを追加したり、それらのコースにモジュールを追加したりできるようにするために使用します。このクラスは現在、次のようになっています。

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

   def addModule
     moduleName = Module.new(30)
     moduleRefNo = Random(100)
     #moduleTitle = @moduleTitle
     moduleYear(4)

     print "What is the name of the module you would like to add?"
     moduleName = gets
     moduleRefNo
     printf "Which year does the module belong to?"
     @@moduleYear = gets
     puts "#{moduleName}, belonging to #{@@moduleYear} has been added to the system, with reference number #{moduleRefNo}."
     navigateTo Application

   end

   def addModuleToScheme

     # Create an empty hash for the schemes
     schemes = Hash.new()

     # Allow user to enter scheme names into a set of variables, and use each scheme name as a hash/ array of modules.
     # Then allow the user to enter the the modules for each scheme into each of the hashes

     # Create specific hash elements by using the following line:
     schemes = {:scheme1 => scheme1variable, :scheme2 => scheme2variable}

     puts "What is the name of the scheme that you would like to add a module to? "
     schemeName = gets

     # Need to use an if statement here to check whether or not the scheme already exists, if it doesn't, create it, if it does,
     # tell the user that it does.

     if schemes.has_key?(schemeName)
       puts "This scheme has already been added "
     else
       schemes.add(schemeName)
     end

     noOfModulesInScheme + 1
     moduleName.moduleScheme = schemeName
   end

   def removeModuleFromScheme
     moduleName.moduleScheme = nil
   end

   def queryModule

   end

 end

現在、メニューの最初のオプションである「モジュールをスキームに追加」に取り組んでいます。Application.rb クラスからプログラムを実行しようとすると、メニューが表示され、選択したいオプションである「1」と入力します。

ただし、メソッド「addModuleToScheme」が未定義であるというエラーが表示されます。「addModuleToScheme」メソッドで私が間違っていることを誰かが指摘できますか?

どうもありがとう。

2012 年 8 月 21 日 00:35 に編集

OK、これで addModuleToScheme メソッドは解決したようですが、実際にスキーム名をハッシュに追加しようとするとエラーが発生します。

ここでメニューから「1」を選択すると、スキームの名前を尋ねられますが、それを入力すると、未定義のメソッド エラーが発生します。

undefined method 'add' for {}:Hash (NoMethodError)" 

ライン上

schemes.add(schemeName) 

私のif elseステートメントで。ここで私が間違っていることはありますか?

4

1 に答える 1

2

CourseModules.addModuleToSchemeそれは未定義だと言っているに違いない。これは、メソッドをクラス メソッドとして使用しようとすると、そのメソッドをインスタンス メソッドとして実装したためです。

次のように定義してみてください。

def self.addModuleToScheme
  # ... do stuff
end

または、インスタンス メソッドとして使用しようとします。その場合、CourseModules最初にクラスの新しいインスタンスを作成する必要があります。

于 2012-08-20T20:09:20.657 に答える