1

モデル担当者がいます

class Representative< ActiveRecord::Base
  validates_inclusion_of :gender, :in => Representative.genders

  def self.genders
    %w(M F)
  end
end

性別関数定義の前に検証行を書くと、それが機能せず、未定義のメソッドの性別エラーが発生します。それが機能する関数の下に検証を書くと、なぜこれが起こるのですか?シーケンスを気にせずに関数を呼び出して定義することに慣れていますが、ここで何か本当に問題が発生していますか?

ありがとう

4

2 に答える 2

3

Rubyは、shimeが説明するように、コードを1行ずつ実行します。したがって、を実行するときにvalidates_inclusion_of、メソッドを見つけようとしますgenders。その時点ではそのメソッドが見つからないため、エラーが発生します。そのメソッドを上に移動するか、単に定数を定義することをお勧めします。

エラーのバックトレースを確認し、理解してみてください。

class Representative < ActiveRecord::Base
  def self.genders
    %w(M F)
  end

  validates_inclusion_of :gender, :in => Representative.genders
end

後でを呼び出してアクセスできるように、定数を定義する方法は次のとおりですRepresentative::GENDERS

class Representative < ActiveRecord::Base
  GENDERS = %w(M F)

  validates_inclusion_of :gender, :in => GENDERS
end
于 2012-05-28T13:54:57.437 に答える
0

ここでは、他のメソッドへの引数としてメソッド呼び出しを渡しています。

これを例で説明しましょう

class Printer
  def print(something)
    print something
  end


  print sheet

  def sheet
    "sheet!"
  end
end

ここでは、NameError-未定義のローカル変数またはメソッドを取得しますsheet

何が起こるかというと、rubyは式を評価しようとし、それsheetがメソッド呼び出しであると判断します。次に、メソッドを呼び出して、この種のエラーをスローします。

メソッド定義をメソッド呼び出しの上に移動すると、定義されます。

class Printer
  def print(something)
    puts something
  end

  def sheet
    "sheet!"
  end

  print sheet
end
于 2012-05-28T12:47:31.193 に答える