2013-03-20 59 views
4

当我使用一个Rails引擎,并希望重写,并添加到它的行为,我都面临着以下问题:重写ActiveRecord模型并定义新的attr_accessible时,如何添加而不重复?

说发动机有场名为

module MyEngine 
    class Course < ActiveRecord::Base 

    attr_accessible :name, :description, :price 

    end 
end 

一个ActiveRecord的模型,我想在我的主要的Rails应用程序创建一个迁移,到列添加到它,我需要新的列添加到attr_accessible(这样可以大量分配)

MyEngine::Course.class_eval do 
    attr_accessible :expiration_date 
end 

但随后的Rails抱怨说第一3 attrs不是M屁股分配的,因此而不是“加入”新属性的覆盖,我要重新声明中重写类中的所有属性,如:

MyEngine::Course.class_eval do 
    attr_accessible :name, :description, :price, :expiration_date 
end 

有没有更好的办法不重新声明这些属性,并添加新的属性?

回答

0

通过查看源代码:

# File activemodel/lib/active_model/mass_assignment_security.rb, line 174 
def attr_accessible(*args) 
    options = args.extract_options! 
    role = options[:as] || :default 

    self._accessible_attributes = accessible_attributes_configs.dup 

    Array.wrap(role).each do |name| 
    self._accessible_attributes[name] = self.accessible_attributes(name) + args 
    end 

    self._active_authorizer = self._accessible_attributes 
end 

你可以尝试使用内部数据结构之一来恢复已定义的属性,这样您便不会重复的代码,或者你可以破解你的方式,并创建一个新的方法,让你“追加”值attr_accessible。但是目前还没有针对此的代码。

相关问题