Двойные вложенные модельные формы - PullRequest
8 голосов
/ 10 августа 2011

У меня все еще есть проблемы с вложенными формами.Вот мой код формы:

<%= form_for @account do |f| %>

<%= f.label :account_type %><br />
<%= f.text_field :account_type %><br />

    <%= f.fields_for :organizations do |builder| %>
        <%= builder.label :name %><br />
        <%= builder.text_field :name %><br />
        <%= builder.label :website %><br />
        <%= builder.text_field :website %><br />

        <%= f.fields_for :locations do |builder| %>
            <%= builder.label :phone %><br />
            <%= builder.text_field :phone %><br />
            <%= builder.label :toll_free_phone %><br />
            <%= builder.text_field :toll_free_phone %><br />
            <%= builder.label :fax %><br />
            <%= builder.text_field :fax %><br />
        <% end %>
    <% end %>

<%= f.submit "Add account" %>
<% end %>

Модель учетной записи:

class Account < ActiveRecord::Base

has_many :organizations

accepts_nested_attributes_for :organizations
end

Модель организации:

class Organization < ActiveRecord::Base

belongs_to :account

has_many :locations

accepts_nested_attributes_for :locations
end

И модель местоположения:

class Location < ActiveRecord::Base

belongs_to :organization

end

И, наконец, контроллер учетных записей:

class AccountsController < ApplicationController

def new
    @account = Account.new
    organization = @account.organizations.build
    organization.locations.build

    @header = "Create account"
end

def create
    @account = Account.new(params[:account])
    if @account.save
        #handle success
    else
        render 'new'
    end
end
end

Вот ошибка, которую я получаю:

ActiveRecord::UnknownAttributeError in AccountsController#create

unknown attribute: locations
Rails.root: C:/Documents and Settings/Corey Quillen/My       
Documents/rails_projects/shop_manager

Application Trace | Framework Trace | Full Trace
app/controllers/accounts_controller.rb:12:in `new'
app/controllers/accounts_controller.rb:12:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"xuZLSP+PSjdra3v51nIkJYZeXRM0X88iF135hPlp4sc=",
 "account"=>{"account_type"=>"Company",
 "organizations_attributes"=>{"0"=>{"name"=>"Atlas",
 "website"=>"www.atlas.com"}},
 "locations"=>{"phone"=>"555-555-5555",
 "toll_free_phone"=>"800-555-5555",
 "fax"=>"512-555-5555"}},
 "commit"=>"Add account"}

Любая помощь с этим будет принята с благодарностью.Я смотрю на это уже пару часов.

Ответы [ 2 ]

15 голосов
/ 10 августа 2011

Вы должны использовать новый конструктор во вложенной форме для вложенной вложенной формы :)):

<%= form_for @account do |f| %>

<%= f.label :account_type %><br />
<%= f.text_field :account_type %><br />

    <%= f.fields_for :organizations do |builder| %>
        <%= builder.label :name %><br />
        <%= builder.text_field :name %><br />
        <%= builder.label :website %><br />
        <%= builder.text_field :website %><br />

        <%= builder.fields_for :locations do |lb| %>
            <%= lb.label :phone %><br />
            <%= lb.text_field :phone %><br />
            <%= lb.label :toll_free_phone %><br />
            <%= lb.text_field :toll_free_phone %><br />
            <%= lb.label :fax %><br />
            <%= lb.text_field :fax %><br />
        <% end %>
    <% end %>

<%= f.submit "Add account" %>
<% end %>
1 голос
/ 07 ноября 2011

Четное решение DRYer:

1) в вашем Gemfile, укажите nested_form в качестве зависимости.

2) в ваших моделях сделайте следующее:

class Account <  ActiveRecord::Base
  accepts_nested_attributes_for :organizations
end

class Organization < ActiveRecord::Base
  accepts_nested_attributes_for :locations
end

3) создайте обычные формы для Организации в ./app/view/organizations/ and for Location under. / App / view / location / `

4) в форме вашей Учетной записи, сделайте следующее: (это становится довольно коротким!)

<%= nested_form_for @account do |f| %>

<%= f.label :account_type %><br />
<%= f.text_field :account_type %><br />

 <%= f.fields_for :organizations %>

<%= f.submit "Add account" %>
<% end %>

5) в вашей организационной форме, сделайте следующее: (также довольно коротко)

<%= nested_form_for @organization do |f| %>
<%= f.label :name %><br />
    <%= f.text_field :name %><br />
    <%= f.label :website %><br />
    <%= f.text_field :website %><br />

    <%= f.fields_for :locations %>

<%= f.submit "Add Organization" %>
<% end %>

Проверьте эти RailsCasts:

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...