使用:autosave for has_one association:如何在孩子的控制器上显示父母的错误?

时间:2013-08-05 18:44:49

标签: ruby-on-rails associations has-one autosave validates-associated

我创建了一个如下所示的模型:

class Parent < ActiveRecord::Base
  attr_accessible :child, :child_id

  has_one :child, :class_name => 'Child', :autosave => true, :inverse_of => :parent

  #parent's validations

  validates_associated :child
end

孩子模型就像:

class Child < ActiveRecord::Base
  attr_accessible :parent, :parent_id

  belongs_to :parent, :inverse_of => :child

  validates_presence_of :parent
  #Other custom validations...
end

当我在新孩子的页面时,如果用户没有为孩子选择之前创建的父母,我想强迫他在创建孩子的同时创建一个父母。 如果用户正确填写子项和父项的所有数据,它工作正常,但如果父项在给定字段上有任何验证问题,我得到的唯一消息是:“父项不能为空”

我想向用户展示如果他单独创建父母就会显示的相同消息。这应该是这样的:“父母的字段X太短”。

是否可以使用validates_associated或使用类似的帮助器?

提前致谢!

1 个答案:

答案 0 :(得分:4)

回答我自己的问题.. 问题在于:

validates_associated :child
:自动保存:inverse_of 选项已经完成了我想要的操作。 validates_associated是不必要的,正如我所读,已弃用。

:自动保存选项使父级在保存父级之前保存已关联的已加载子级。

使用:inverse_of 选项,它将保存子项,运行其验证,如果出现问题,则将子项的错误添加到父项,而不说“子项无效”

此外..我使用 accepts_nested_attributes_for 。所以我将孩子和父母加载到父母的控制器上,然后保存了父母:

@parent = Parent.new(params[:parent])
@parent.build_child(params[:parent][:child])

if @parent.save
    redirect_to(@parent ....etc.....

错误随着我想要闪现。

再见:)