Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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 为什么ActiveRecord回调要求实例变量或实例方法以self关键字作为前缀?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 为什么ActiveRecord回调要求实例变量或实例方法以self关键字作为前缀?

Ruby on rails 为什么ActiveRecord回调要求实例变量或实例方法以self关键字作为前缀?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,ActiveRecord有几种不同的回调方法用于简化模型逻辑。例如,查找方法后的和创建方法前的 考虑以下代码示例: class ExternalPrintingCard < ActiveRecord::Base belongs_to :user belongs_to :ph_user after_create :change_pin def change_pin self.user.randomize_printer_pin end def after

ActiveRecord有几种不同的回调方法用于简化模型逻辑。例如,查找方法后的
和创建方法前的

考虑以下代码示例:

class ExternalPrintingCard < ActiveRecord::Base
  belongs_to :user
  belongs_to :ph_user

  after_create :change_pin

  def change_pin
    self.user.randomize_printer_pin
  end

  def after_find
    return if self.card_status == false
    self.card_status = false if self.is_used_up?
    self.card_status = false if self.is_expired?
    self.save!
  end
end
class ExternalPrintingCard
如果我从实例变量或实例方法中删除所有的
self
前缀,则将调用这两个回调,但就好像它们是这些回调方法中的局部变量一样

此实例变量(
card\u status
)、实例方法(
save!
已用完?
已过期?
)和关联(
user
)在这两种回调方法之外运行良好,没有
self
前缀

Rails的回调方法(实例方法)文档中的示例代码似乎总是使用
self
前缀,即使它正在调用实例变量或方法,它们通常不需要
self
前缀就可以访问

我希望对ActiveRecord回调有更好理解的人能够帮助我们了解这种行为


干杯

从技术上讲,你只需要在作业方法前使用自我。 这对于区分带有trailing=的实例方法和对局部变量的赋值是必要的。

Nasmorn是正确的

ActiveRecord::Base将所有列名放置在
@attributes
实例变量(哈希)中,并为这些列名创建访问器实例方法

例如:

card_status是external_printing_cards表中的一列,它将具有名为
card_status
card_status=

由于ruby局部变量定义是动态的,因此

def after_find
  ....  
  card_status = false if self.is_used_up?
  ....
end
这意味着我们正在定义并分配一个局部变量
card\u status
,而不是实例方法
card\u status=


Peer Allan发布的文章对此提供了更多解释。

有关详细信息,请参阅这篇Thoughtbot文章: