4

Rails エンジンを使用していて、その動作をオーバーライドして追加したい場合、次の問題に直面しました。

Engine に 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

内部データ構造の 1 つを使用して、既に定義されている属性を回復することを試みることができるので、コードを複製しないでください。または、方法をハックして、値を「追加」できる新しいメソッドを作成することもできます。 attr_accessible。しかし、そのためのコードはまだ作成されていません。

于 2013-04-15T14:59:23.800 に答える