检查before_save中的嵌套属性

时间:2011-04-03 18:34:29

标签: ruby-on-rails ruby nested-attributes

当您向控制器提交表单以保存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

2 个答案:

答案 0 :(得分:2)

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

啰嗦,但这解决了它

答案 1 :(得分:1)

@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模型