2012-07-10 17 views
6

這可能是一個愚蠢的問題,但我找不到解決方案。在after_save中調用類方法

我有一個簡單的模型,使用類方法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 

但它看起來對實例的方法(不存在),而不是類。

感謝您的回答。

回答

5

通過刪除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 
+0

你是對的繼承,我只是鍵入它給內容。然而,這是一個品味的問題;-)否?將方法保持在類級而不是實例級。因爲它只更新一個類變量。有沒有辦法指定它是after_save中的類方法?你總是不得不依靠實例方法? – microcosme 2012-07-10 14:04:45

+0

您正在考慮錯誤方向的問題。是的,你正在更新一個類變量,但是在保存一個**實例**後觸發回調。它是一個實例變量的回調...不是對類的回調,因爲不能「保存」一個類。 – Dty 2012-07-10 15:29:08

5
after_save :update_menu 

def updated_menu 
    self.class.update_menu 
end 

這將調用類update_menu方法

2
after_save 'self.class.update_menu' 

Rails會評估符號作爲一個實例方法。爲了調用一個類方法,你必須傳遞一個字符串,它將在正確的上下文中進行評估。

+2

傳遞字符串以定義回調已被棄用,並將在Rails 5.1中被刪除而無需替換 – ana06 2016-09-16 15:54:22