Rails 3验证父模型验证嵌套属性失败

时间:2013-04-10 02:43:13

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

我有两个型号,User和House。他们有一对一的关联。

class User < ActiveRecord::Base
   attr_accessible :name, :house_attributes
   has_one :house, :dependent => :destroy
   validates :name, :presence => true
   accepts_nested_attributes_for :house, allow_destroy: true, :reject_if =>    lambda { |a| a['desc'].blank? }
end

class House < ActiveRecord::Base
   attr_accessible :desc, :price
   belongs_to :user
   validates :desc, :presence => true
end

现在我在用户新视图中创建了一个嵌套表单,如下所示:

<%= simple_form_for(@user) do |f| %>
  <%= f.input :name %>
  <%= f_builder.simple_fields_for :house, @house do |h| %>
    <%= h.input :price %>
    <%= h.input :desc %>
   <% end %>
  <%= f.button :submit %>
<% end %>

新控制器就像这样

def new
  @user = User.new
  @house = @user.build_house

  respond_to do |format|
    format.html # new.html.erb
  end
end

我想在创建用户的同时创建一个房子。因此,如果房屋未通过验证,则不应创建用户。 (现在房屋模型只有一个验证,即:需要存在desc字段。)

模型中的代码,仅保证不创建house,如果:desc为空。但它仍然会创建用户。

我尝试在User模型中添加自定义验证,但无法在User模型中找到访问:desc属性(无法调用self.desc)或:house_attributes(self.house_attributes)的方法。在创建房屋之前,我真的不知道rails在哪里存储这些房屋属性。

我希望你们能帮助我找到一个好的,明确的方式

1)能够验证并显示:desc属性的错误消息。此时错误消息仅显示:用户模型的名称字段。

2)如果用户或住宅的验证失败,请不要保存用户。

3)如果任何验证失败,则渲染:new

由于

1 个答案:

答案 0 :(得分:3)

您应该将validates_associated :house添加到您的用户模型中。这将运行众议院验证并确保它们在考虑用户有效之前成功。