我有一位模特代表
class Representative< ActiveRecord::Base
validates_inclusion_of :gender, :in => Representative.genders
def self.genders
%w(M F)
end
end
当我在性别函数定义之前编写验证行时,它不起作用,它给出了未定义的方法性别错误。当我在其功能下面编写验证时,为什么会发生这种情况?我习惯于调用和定义函数而不必担心序列,我在这里遇到了什么问题吗?
由于
答案 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