Вам необходимо настроить свои модели следующим образом:
app / models / account.rb
class Account < ActiveRecord::Base
has_many :organizations
accepts_nested_attributes_for :organizations
end
app / models / organization.rb
class Organization < ActiveRecord::Base
has_many :people
accepts_nested_attributes_for :people
end
Затем вы настроите действие new
в вашем AccountsController
следующим образом:
class AccountsController < ApplicationController
def new
@account = Account.new
organization = @account.organizations.build
person = @account.people.build
end
end
Почему?Ну, потому что вы настроите форму в app/views/accounts/new.html.erb
следующим образом:
<%= form_for(@account) do |account| %>
<%# account fields go here, like this: %>
<p>
<%= account.label :name %>
<%= account.text_field :name %>
</p>
<%# then organization fields, nested inside the account (which is what account represents) %>
<%# this will create a new set of fields for each organization linked to the account %>
<%= account.fields_for :organizations do |organization| %>
<p>
<%= account.label :name %>
<%= account.text_field :name %>
</p>
<%# and finally, people %>
<%= organization.fields_for :people do |person| %>
<p>
<%= person.label :name %>
<%= account.text_field :name %>
</p>
<% end %>
<% end %>
<% end %>
Все эти поля затем будут переданы обратно действию create
в AccountsController
, вложенном в params[:account]
.Вы имеете дело с ними следующим образом:
class AccountsController < ApplicationController
def create
@account = Account.new(params[:account])
if @account.save
# do something here like...
redirect_to root_path, :notice => "Account created!"
else
#
flash[:error] = "Account creation failed!"
render :new
end
end
end
Поскольку вы определили accepts_nested_attributes_for
в моделях Account
и Organization
, параметры будут успешно проанализированы, и при создании учетной записи будутсоздайте организацию и свяжите ее с учетной записью, а затем создайте человека и также свяжите его с организацией.
Готово!