我有两个模型,用户和房屋。他们有一对一的关联。
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)如果任何验证失败,渲染:新
谢谢