1

attr_accessibleは、指定されていないすべての属性を保護されているものとしてマークしますが、attr_readonly.

私は次のようにモデルを設定しています:

class Foo < ActiveRecord::Base
  attr_accessible :bar, :baz
  attr_readonly :shiz
end

class FooParent < ActiveRecord::Base
  has_many :foos
end

@foo_parent.foos.build(:bar => 1, :baz => 2, :shiz => 3)     # Can't mass-assign protected attribute: :shiz

ここでの明らかな回避策は、 を使用attr_readonlyせず、キー属性なしでオブジェクトを作成し、後でそれらを設定して保存することです。このアプローチの欠点は、少なくとも 2 回の書き込みが発生したことです。この作成メソッドは、人間が可能な限りパフォーマンスを発揮する必要があります。

@foo_parent.foos.build(:bar => 1, :baz => 2)                 # write #1
@foo_parent.foos.each do |f|
  f.update_attribute(:baz, 3)                                # write #2 and more
end

Can't mass-assign protected attributes作成後に読み取り専用保護の利点を享受しながら、エラーをトリガーすることなく、アクセス可能な属性と読み取り専用属性を持つオブジェクトを 1 回の書き込みで作成するにはどうすればよいですか?

4

2 に答える 2

4

編集:一括割り当てセキュリティ を参照してください

交換

attr_accessible :bar, :baz

attr_accessible :bar, :baz, :shiz
于 2013-02-06T05:27:40.980 に答える
3

Foo.createで代用できますFoo.new

f = Foo.new(:bar => 1, :baz => 2)             # no write
f.update_attribute(:shiz, 3)                     # write 1

:shizと の両方 attr_accessibleに設定することもできますattr_readonly

attr_accessible :bar, :baz, :shiz
attr_readonly :shiz

f = Foo.create(bar: 1, baz: 2, shiz: 3)        # write 1

ここで変更しよう:shizとしても、変更されません (読み取り専用であるため)。

f.update_attribute(:shiz, 15)
f.reload
f.shiz
=> 3
于 2013-02-06T03:53:55.160 に答える