4

当我使用 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 抱怨前 3 个属性不是 Mass-Assignable,因此我必须重新声明被覆盖类中的所有属性,而不是仅仅将新属性“添加”到覆盖中,例如:

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

有没有更好的方法不重新声明这些属性,而只是添加新属性?

4

1 回答 1

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。但是还没有为此编写代码。

于 2013-04-15T14:59:23.800 回答