0

我有两个模型,用户和房屋。他们有一对一的关联。

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 字段。)

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

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

我希望你们能帮助我找出一个好的和清晰的方法

1) 能够验证并显示 :desc 属性的错误消息。现在错误消息只会显示在用户模型的 :name 字段中。

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

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

谢谢

4

1 回答 1

3

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

于 2013-04-10T04:02:27.933 回答