Использование обоих attr_accessible AND attr_readonly не позволяет создавать записи
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
Как я могу добиться создания объекта с доступными атрибутами И атрибутами только для чтения за 1 запись, не вызывая Can't mass-assign protected attributes
ошибка, все еще пользуясь преимуществами защиты от чтения только после создания?
2 ответа
Вы можете заменить 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
Изменить: см. Безопасность массовых назначений
замещать
attr_accessible :bar, :baz
с
attr_accessible :bar, :baz, :shiz