我有两个型号,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
由于
答案 0 :(得分:3)
您应该将validates_associated :house
添加到您的用户模型中。这将运行众议院验证并确保它们在考虑用户有效之前成功。