2015-09-08 37 views
2

我只是抓住了Rails中的疑慮,並試圖爲ActiveRecord類實現簡單的日誌記錄。在那裏,我想定義應該進入日誌的字段,並在保存後自動寫入日誌。Rails:關注before_filter類型的方法

我有這樣的:

#logable.rb (the concern) 
module Logable 
    extend ActiveSupport::Concern 

    @field = nil 
    module ClassMethods 
    def set_log_field(field) 
     @feild = field 
    end 
    end 

    def print_log 
    p "LOGGING: #{self[@index.to_s]}" 
    end 
end 


#houses.rb (the model using the concern) 
class House < ActiveRecord::Base 
    include Logable 
    after_save :print_log 
    set_log_field :id 
end 

不幸的是,呼叫set_log_field沒有效果 - 或者更確切地說,給定的值不使其print_log。 我在做什麼錯?

感謝您的幫助!

回答

0

你大概是說這個(順便說一句,爲什麼不Loggable):

# logable.rb 
module Logable 
    extend ActiveSupport::Concern 

    # Here we define class-level methods. 
    # Note, that @field, defined here cannot be referenced as @field from 
    # instance (it's class level!). 
    # Note also, in Ruby there is no need to declare @field in the body of a class/module. 
    class_methods do 
    def set_log_field(field) 
     @field = field 
    end 

    def log_field 
     @field 
    end 
    end 

    # Here we define instance methods. 
    # In order to access class level method (log_field), we use self.class. 
    included do 
    def print_log 
     p "LOGGING: #{self.class.log_field}" 
    end 
    end 
end 

更新你還問什麼在included塊方法之間的差異,這些方法體內。

簡歷簡歷看起來沒有什麼區別。在非常好的近似值中,你可以認爲它們是相同的。唯一的區別在於依賴管理。在ActiveSupport::Concern文檔末尾給出了很好的例子。值得一讀,看看!

+0

太棒了,那有效!你能否解釋在包含的do ... end中定義的方法與每個塊之外的方法(當然是在模塊中)之間有什麼區別? – Daniel

+0

@DanielArnreich我已經用最好的鏈接更新了我的答案,他們對你提出的差異有很好的例子。 – dimakura