Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby on Rails:有类似于C++虚拟方法的子类吗?_Ruby On Rails_Ruby_Oop - Fatal编程技术网

Ruby on rails Ruby on Rails:有类似于C++虚拟方法的子类吗?

Ruby on rails Ruby on Rails:有类似于C++虚拟方法的子类吗?,ruby-on-rails,ruby,oop,Ruby On Rails,Ruby,Oop,我有一个抽象模型,它有很多实现子模型。我希望能够在抽象模型中定义一些函数,这些函数在对子模型调用时依赖于子模型自己的定义。在RubyonRails中,这样的事情可能发生吗 例如,在子模型中定义了长度属性: class Animal validates_inclusion_of :length, :in => MIN_LENGTH..MAX_LENGTH end class Elephant < Animal MIN_LENGTH = 5 MAX_LENGTH = 20

我有一个抽象模型,它有很多实现子模型。我希望能够在抽象模型中定义一些函数,这些函数在对子模型调用时依赖于子模型自己的定义。在RubyonRails中,这样的事情可能发生吗

例如,在子模型中定义了长度属性:

class Animal
  validates_inclusion_of :length, :in => MIN_LENGTH..MAX_LENGTH
end

class Elephant < Animal
  MIN_LENGTH = 5
  MAX_LENGTH = 20
end
然后当我去大象。新的。保存!我希望它使用大象的常量运行验证

我之所以要这样做,是因为这样的验证对于所有的子模型都是通用的,唯一不同的是常数的值

当我尝试这样做,或者使用小写方法时,在这两种情况下,我都会得到一个未定义值的名称错误

这样的事情在Rails中可能发生吗

validates_inclusion_of :length, :in => MIN_LENGTH..MAX_LENGTH
在Ruby看到您的动物类时执行。因此,它自然地使用了当时出现的最小/最大长度值。要覆盖此行为,可以执行以下操作:

validates_inclusion_of :length, :in => lambda {|animal| animal.class.age_range }
然后在“动物”和“大象”两个类中定义,或者如果你不打算生下一只正义的动物,则在最后一个类中定义:

这样,当需要时,将计算您的:in范围,为:in提供适合某些物种的范围

另外,我猜你省略了你的动物的基类只是为了节省一些击键次数

在Ruby看到您的动物类时执行。因此,它自然地使用了当时出现的最小/最大长度值。要覆盖此行为,可以执行以下操作:

validates_inclusion_of :length, :in => lambda {|animal| animal.class.age_range }
然后在“动物”和“大象”两个类中定义,或者如果你不打算生下一只正义的动物,则在最后一个类中定义:

这样,当需要时,将计算您的:in范围,为:in提供适合某些物种的范围


另外,我猜你省略了你的动物的基类只是为了节省一些击键次数

你确定这有用吗?这对我来说绝对是个好主意。然而,Rails似乎期望:in指向容器,而不是将动物传递给我的lambda函数。这就是我得到的错误-ArgumentError:一个包含方法的对象?必须作为配置hashYes的:in选项提供。下面是API文档的摘录:验证包含:states,:in=>lambda{person}states[person.country]}。而且我在回答之前就试过了。啊,算出来了。看起来这是在2011年4月10日添加的,这可能意味着我需要从3.0升级到至少Rails 3.1才能正常工作。很抱歉。你忘了指定软件的版本,所以我帮不上忙。你确定这样行吗?这对我来说绝对是个好主意。然而,Rails似乎期望:in指向容器,而不是将动物传递给我的lambda函数。这就是我得到的错误-ArgumentError:一个包含方法的对象?必须作为配置hashYes的:in选项提供。下面是API文档的摘录:验证包含:states,:in=>lambda{person}states[person.country]}。而且我在回答之前就试过了。啊,算出来了。看起来这是在2011年4月10日添加的,这可能意味着我需要从3.0升级到至少Rails 3.1才能正常工作。很抱歉。你忘了指定软件的版本,所以我帮不了你什么忙。