validates_inclusion_of没有方法错误

时间:2012-05-28 12:29:09

标签: ruby-on-rails-3 validation activerecord

我有一位模特代表

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

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

当我在性别函数定义之前编写验证行时,它不起作用,它给出了未定义的方法性别错误。当我在其功能下面编写验证时,为什么会发生这种情况?我习惯于调用和定义函数而不必担心序列,我在这里遇到了什么问题吗?

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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