Ruby on rails Rails抽象类子级:未定义的方法
我在为数据库表“apollo_Whu rules”植入rails时出错,如下所示:Ruby on rails Rails抽象类子级:未定义的方法,ruby-on-rails,ruby,undefined,abstract-class,Ruby On Rails,Ruby,Undefined,Abstract Class,我在为数据库表“apollo_Whu rules”植入rails时出错,如下所示: NoMethodError: undefined method `simple_guards' for #<Apollo::WhRule:0x0055ffed9928f0> NoMethodError:未定义的“简单保护”方法# 我最近更改了一个名为“Apollo::WhRule”的模型,以从一个新的抽象类继承,该抽象类本身从另一个抽象类继承 我的型号 class Apollo::WhRule &
NoMethodError: undefined method `simple_guards' for #<Apollo::WhRule:0x0055ffed9928f0>
NoMethodError:未定义的“简单保护”方法#
我最近更改了一个名为“Apollo::WhRule”的模型,以从一个新的抽象类继承,该抽象类本身从另一个抽象类继承
我的型号
class Apollo::WhRule < Marty::SqlRule
class阿波罗::WhRule
SqlRule抽象类
class Marty::SqlRule < Marty::BaseRule
self.abstract_class = true
before_validation(on: [:create, :update]) do
self.expressions ||= {}
end
class Marty::BaseRule < Marty::Base
self.abstract_class = true
before_validation(on: [:create, :update]) do
self.simple_guards ||= {}
self.computed_guards ||= {}
self.grids ||= {}
self.results ||= {}
end
class Marty::SqlRule
基本规则抽象类
class Marty::SqlRule < Marty::BaseRule
self.abstract_class = true
before_validation(on: [:create, :update]) do
self.expressions ||= {}
end
class Marty::BaseRule < Marty::Base
self.abstract_class = true
before_validation(on: [:create, :update]) do
self.simple_guards ||= {}
self.computed_guards ||= {}
self.grids ||= {}
self.results ||= {}
end
class Marty::BaseRule
那么我如何阻止这个错误的发生呢?我试图在Apollo::WhRule类中创建一个名为simple_guards的方法,但没有成功
我在这个设置的工作方式中遗漏了什么?解决问题的最佳方法是什么 这一行有很多内容:
self.simple_guards ||= {}
如果您查看这段稍长但功能相当的代码,就更容易准确地理解发生了什么:
self.simple_guards = self.simple_guards || {}
将对此进行评估,以便首先“解析”=
的右侧。因此,首先将发生的事情是对self.simple\u guards
进行评估,这将导致您发布的错误。在Apollo::WhRule
类中添加simple\u-guards
方法是正确的。添加该方法应允许线的右侧完全解析
我敢打赌,在添加了simple\u-guards
方法之后,错误发生了微小的变化,然后抱怨缺少simple\u-guards=
方法(现在方法名称的末尾有一个等号)。这是因为在将右侧解析为某个值后,将对左侧求值,以查看结果存储的位置。您可以通过定义simple\u guards=
方法来克服错误
如果要将该值存储在临时变量中,然后返回该值,则这两个方法可能如下所示:
def simple_guards=(simple_guards)
@simple_guards = simple_guards
end
def simple_guards
return @simple_guards
end
这是一种非常常见的模式,您可以使用以下帮助器方法:
attr_reader :simple_guards
attr_writer :simple_guards
如果要同时使用这两个助手,可以将它们简化为一行:
attr_accessor :simple_guards