2012-07-10 14 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

+0

あなたは間違った方向に問題を考えています。はい、クラス変数を更新していますが、**インスタンス**が保存された後にコールバックが発生します。これはインスタンス変数のコールバックです。クラスのコールバックではなく、クラスを「保存」することができないためです。 – Dty

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

関連する問題