2013-10-04 3 views
1

У меня есть класс арендодателя и у него есть N адресов. Арендодатель принимает вложенные атрибуты для адресов У меня есть форма, которая используется для создания арендодателя в этой форме, является подформой для создания адреса.Создание вложенной модели из метода родительского создания

Адрес требует, чтобы landlord_id был действительным и, следовательно, сохранил.

Как я создаю арендодателя, как мне создать адрес, не сохраняя арендодателя дважды в вызове метода создания в контроллере арендодателя?

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

Конечно, использовать find_or_initialize_by(...) вместо where(...).first_or_create (в качестве альтернативы, вы можете сохранить тот же шаблон и 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 [: landlord] .except (: addresses) – CodeGroover

+1

@CodeGroover: Тип, кроме того, что вы хотите ограничить его критериями поиска. Я бы скомпрометировал использование 'slice'. – PinnyM

Смежные вопросы