Ruby on rails 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 &

我在为数据库表“apollo_Whu rules”植入rails时出错,如下所示:

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