当我使用Rails引擎,并希望覆盖并添加其行为时,我遇到了以下问题:
假设引擎具有名为Course
的ActiveRecord模型module MyEngine
class Course < ActiveRecord::Base
attr_accessible :name, :description, :price
end
end
我想在我的主Rails应用程序中创建一个迁移,向其中添加一列,我需要将新列添加到attr_accessible(因此可以进行批量分配)
MyEngine::Course.class_eval do
attr_accessible :expiration_date
end
但是Rails抱怨说前三个attrs不是Mass-Assignable,所以我不得不重新声明覆盖类中的所有属性,而不是仅仅“重新”添加新属性,如:
MyEngine::Course.class_eval do
attr_accessible :name, :description, :price, :expiration_date
end
有没有更好的方法可以不重新声明这些属性,只需添加新属性?
答案 0 :(得分: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。但是目前还没有代码烘焙过。