Вложенные ресурсы для двух моделей - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть 3 модели: Учетная запись, Организация и Персона

Account 
  has many Organizations 
  has many People
Organization
  belongs to Account
  has many People
People
  belongs to Organization
  belongs to Account

Проблема здесь заключается в том, как при создании новой Учетной записи, Организации и Персоны в той же форме, как записать идентификатор учетной записи и идентификатор организации встол людей?

1 Ответ

1 голос
/ 13 декабря 2011

Вам необходимо настроить свои модели следующим образом:

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, параметры будут успешно проанализированы, и при создании учетной записи будутсоздайте организацию и свяжите ее с учетной записью, а затем создайте человека и также свяжите его с организацией.

Готово!

...