Использование обоих 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
Другие вопросы по тегам