2013-07-10 41 views
0

所以我有如下的AR模型,我想動態生成一些實例方法,如#fallbackable_header_script, #fallbackable_header_content...等,就像我已經寫過的#fallbackable_background一樣。什麼是最好的方法來做到這一點?在ActiveRecord模型中使用def_method

class Course < ActiveRecord::Base 
    FALLBACKABLE_ATTRIBUTES = :header_script, :header_content, :footer_content 
    OTHER_FALLBACKABLE_ATTRIBUTES = :css_config 

    def fallbackable_background 
    read_attribute(:background) ? background : self.user.background 
    end 

end 

我試過def_method,但下面不工作...

[:foo, :bar].each do |meth| 
    fallbackable_meth = "fallbackable_#{meth}".to_sym 
    def_method(fallbackable_meth) { read_attribute(meth) ? read_attribute(meth) : self.user.send(meth) } 
    end 
    #=>NoMethodError: undefined method `def_method' for #<Class:0x007fe4e709a208> 

回答

1

我認爲它define_method而不是def_method

[:foo, :bar].each do |meth| 
    fallbackable_meth = "fallbackable_#{meth}".to_sym 
    define_method(fallbackable_meth) { read_attribute(meth) ? read_attribute(meth) : self.user.send(meth) } 
    end 

您還可以使用def_each定義相似方法

def_each :fallbackable_foo, :fallbackable_bar do |method_name| 
read_attribute(method_name) ? read_attribute(method_name) : self.user.send(method_name) 
end 
+0

我也想通了當我再次看着它的時候。 :) 謝謝! – randomor

+0

感謝您的提示也! – randomor

相關問題