在after_save中调用类方法

mic*_*sme 6 ruby-on-rails

这可能是一个愚蠢的观点,但我找不到解决方案.

我有一个带有类方法的简单模型,update_menu我希望在每次保存实例后调用它.

Class Category
  attr_accessible :name, :content


  def self.menu
     @@menu ||= update_menu
  end

  def self.update_menu
     @@menu = Category.all
  end
end
Run Code Online (Sandbox Code Playgroud)

那么after_filter接听电话的正确语法是什么update_menu

我试过了:

after_save :update_menu
Run Code Online (Sandbox Code Playgroud)

但它在实例(不存在)上查找方法而不在类上查找.

谢谢你的回答.

Dty*_*Dty 6

通过删除使其成为实例方法self.

# now an instance method
def update_menu
   @@menu = Category.all
end
Run Code Online (Sandbox Code Playgroud)

after_save在类方法上进行回调没有多大意义.不保存类,实例是.例如:

# I'm assuming the code you typed in has typos since
# it should inherit from ActiveRecord::Base
class Category < ActiveRecord::Base
  attr_accessible :name
end

category_one = Category.new(:name => 'category one')
category_one.save  # saving an instance

Category.save # this wont work
Run Code Online (Sandbox Code Playgroud)


Ere*_*bih 6

after_save :update_menu

def updated_menu
  self.class.update_menu
end
Run Code Online (Sandbox Code Playgroud)

这将调用类update_menu方法


jpg*_*eek 5

after_save 'self.class.update_menu'
Run Code Online (Sandbox Code Playgroud)

Rails 将评估一个符号作为实例方法。为了调用类方法,您必须传递一个字符串,该字符串将在正确的上下文中进行评估。

注意:这仅适用于 Rails 4。请参阅 Rails 5 的 Erez 答案。

  • 不推荐使用传递字符串来定义回调并将在 Rails 5.1 中删除而不替换 (4认同)