7

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

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

Class Category
  attr_accessible :name, :content


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

  def self.update_menu
     @@menu = Category.all
  end
end

那么获取after_filter呼叫的正确语法是什么update_menu

我试过了:

after_save :update_menu

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

感谢您的回答。

4

3 回答 3

6

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

# now an instance method
def update_menu
   @@menu = Category.all
end

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
于 2012-07-10T12:36:29.663 回答
6
after_save :update_menu

def updated_menu
  self.class.update_menu
end

这将调用类 update_menu 方法

于 2012-07-10T12:43:28.100 回答
5
after_save 'self.class.update_menu'

Rails will evaluate a symbol as an instance method. In order to call a class method, you have to pass a string which will be evaluated in the correct context.

NOTE: This only works with rails 4. See Erez answer for Rails 5.

于 2012-09-04T05:40:38.893 回答