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 解释的那样。因此,在运行时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 回答