2013-10-04 52 views
1

我有一个房东类,它有N个地址。 房东接受地址的嵌套属性 我有一个窗体,用于创建该窗体的房东是创建地址的子窗体。从父创建方法内创建嵌套模型

该地址要求房东标识符有效,因此保存。

当我创建房东时,如何创建地址而不必在房东控制器中的create方法调用中保存房东两次?

landlord_controller.rb#创建

def create  
    #check if a landlord of the same name already exists and load that instead 
    @landlord = Landlord.where(:name => params[:landlord][:name], \ 
     :city_id => params[:landlord][:city_id], \ 
     :province_id => params[:landlord][:province_id]). 
    first_or_create 

if @landlord.save 

    flash[:success] = #"Thank you for submitting a Landlord " 
    #@landlord.addresses.build .... 
    #@landlord.save 
    redirect_to @landlord 
else 
    render :new  
end 
end 

房东/ new.html.erb#形式

<%= form_for @landlord do |f| %> 
    <%= f.fields_for :address do |address_form| %> 

    <%= address_form.label :number %> 
    <%= address_form.text_field :number %> 

    <%= address_form.label :street %> 
    <%= address_form.text_field :street %> 

    <%= address_form.label "#{:unit}#/Apt #" %> 
    <%= address_form.text_field :unit %> 

    <%= address_form.label :postal %> 
    <%= address_form.text_field :postal %> 

<% end %> 
<% end %> 
+1

其实,第二个'@ landlord.save'保存地址。如果你不想这样做,你可以分别保存每个“地址”。 –

+0

在您的经验中哪种方法更具优势? – Derptacos

回答

2

当然,使用的where(...).first_or_createfind_or_initialize_by(...)而不是(或者,你可以保持相同的where模式,使用first_or_initialize)。然后用assign_attributes来添加地址,最后试试save。正如@CodeGroover建议的那样,您可以稍微重构一下:

other_params = params[:landlord].slice!(:name, :city_id, :province_id) 
@landlord = Landlord.find_or_initialize_by(params[:landlord]) 

@landlord.assign_attributes(other_params) 

if @landlord.save 
    ... 
+0

迷你重构:Landlord.find_or_initialize_by(params [:landlord]) – CodeGroover

+0

然后可能params [:房东] .except(:地址) – CodeGroover

+1

@CodeGroover:排序,除了你想限制它的搜索条件。我会妥协使用'切片'。 – PinnyM