Проверьте наличие вложенных атрибутов в before_save

Когда вы отправляете форму в контроллер для сохранения в ActiveRecord, вы можете добавить недостающие поля через @foo.field = 'bar'. Я хотел бы сделать то же самое для вложенного атрибута, но я не могу понять, как это сделать.

Я пытаюсь сделать что-то вроде:

'@foo.bar.field = 'baz'

где модель foo

accepts_nested_attributes_for :bar

если это имеет больше смысла.

Изменить: соответствующий код модели

class Product < ActiveRecord::Base
  ...  

  has_many :update

  belongs_to :user, :foreign_key => 'user_id'

  accepts_nested_attributes_for :update, :reject_if => lambda {|a| a[:body].blank?}

  ...
end

Обновить модель

class Update < ActiveRecord::Base
   ...
  belongs_to :product, :foreign_key => 'product_id'

  geocoded_by :address
  reverse_geocoded_by :latitude, :longitude

  validates :body, :presence => true

end

person providence    schedule 03.04.2011    source источник


Ответы (2)


 ((params[:product])["update_attributes"])["0"].merge!({"user_id" => u_id})

затянуто, но это решило

person providence    schedule 03.04.2011

@foo.bar.field = 'baz'

не о accepts_nested_attributes_for. Вы можете добавить before_save валидацию в Bar модель и тогда она будет отлично работать с:

bar = @foo.bar
bar.field = "baz"
bar.save
# => now before_save will be executed

Через accepts_nested_attributes_for это будет выглядеть так:

@foo.bar_attributes = { :id => XXX, :field => "baz" }
@foo.save

В этом случае вы должны добавить валидацию в модель Foo.

person fl00r    schedule 03.04.2011
comment
Это дает мне ошибку неопределенного метода to_i для :integer_field, когда я делаю @product.update_attributes = { :integer_field =› '1' }. Я не вызываю to_i, поэтому я предполагаю, что это неявно.. - person providence; 03.04.2011
comment
почему ты говоришь о @product.update_attributes? Покажи код модели - person fl00r; 03.04.2011
comment
Вышлю код модели. Однако я пытаюсь добавить отсутствующее поле во вложенную форму перед ее сохранением. Доступ к значению этого поля должен осуществляться из контроллера, так как его нет в модели. - person providence; 03.04.2011
comment
1. ПЕРЕИМЕНОВАТЬ ВАШУ Update МОДЕЛЬ! 2. вы не можете установить has_many :update, но has_many :updates, поэтому вы получите accepts_nested_attributes_for :updates и @product.updates_attributes = {...} - person fl00r; 03.04.2011
comment
Я понимаю, что здесь принято использовать множественное число, но мне нужно работать с единственным числом. has_many :update работает нормально, аналогично, проблема не в отсутствии 's' при использовании @product.update_attributes, а скорее в том, что to_i неявно вызывается без уважительной причины - person providence; 03.04.2011
comment
и я ДОЛЖЕН использовать его, нет выбора. Его выбрал другой разработчик - person providence; 03.04.2011