2009-04-12 3 views
6

Я использую Rails 2.3.2 и пытаюсь правильно обработать вложенную форму объекта. Я сузил свою проблему в том, что Rails не устанавливает мои вложенные элементы формы с * _трибутами, необходимыми для инициализации accepts_nested_attributes_for обработки.Rails Вложенная форма объекта * _attributes

Моя модель код:

class Person < Party 
    has_one :name, :class_name => "PersonName" 
    accepts_nested_attributes_for :name, :allow_destroy => true 
end 

class PersonName < ActiveRecord::Base 
    belongs_to :person 
end 

мой взгляд код выглядит следующим образом (я использую HAML):

%h3 New customer 
= error_messages_for :person, :person_name, :name, :country 

- form_for :person, :url => collection_url, :html => {:class => 'MainForm'} do |person_form| 

    - @person.build_name unless @person.name 
    - person_form.fields_for :name do |name_form| 
    = name_form.label :given_name, "First Name:" 
    = name_form.text_field :given_name 

    = name_form.label :family_name, "Last Name:" 
    = name_form.text_field :family_name 

    = hidden_field_tag :inviter_id, params[:inviter_id] 
    = hidden_field_tag :inviter_code, params[:inviter_code] 
    %p= submit_tag "Create" 

= link_to 'Back', collection_url 

Вместо Params существа:

{"person"=>{"name_attributes"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 

I получить:

{"person"=>{"name"=>{"given_name"=>"Fred", "family_name"=>"Flintstone"}}, ...} 

В результате я получаю исключение TypeMismatch. Я следил за документацией от Ryan Daigle. Я также следовал советам от this blog и complex-forms-example.

Используя Firebug, я прошел через мою форму и скорректировал атрибут имени входных тегов от имени до name_attributes. Это создало params с name_attributes, и создание отлично работало.

Я застрял, поскольку не могу понять, почему моя форма не создает форму * _трибутов имени.

Еще одна вещь, которую я пробовал, - это то, что у меня есть complex_form_example, работающий в моей среде. Я прошел через каждый дюйм контроллера, моделей и просмотров и сравнил его с моим кодом. Я не могу найти, что по-другому. Я знаю, что это что-то маленькое, и я буду признателен за любую помощь!

Спасибо!

+0

Как выглядит ваш код вида? –

+0

Я добавил представление своего кода. –

+0

Примечание: он не работает, если вы еще не определили параметр accepts_nested_attributes! Но в вашем случае все в порядке :). – reto

ответ

4

сообщения спины не назначьте в нужном месте

def new 
    @person = Person.new 
end 

<% form_for @person do |f| %> 
    <% f.fields_for :name_attributes do |p| %> 
     ... 
    <% end %> 
<% end %> 

сообщения спина назначьте в нужном месте

def new 
    @person = Person.new 
    @person.name = PersonName.new # << this allows fields_for :relation vs :relation_attributes 
end 

<% form_for @person do |f| %> 
    <% f.fields_for :name do |p| %> 
     ... 
    <% end %> 
<% end %> 

Не нужно, чтобы @ person.name снова в #create

+1

Вы также можете написать: @ person.build_name вместо @ person.name = PersonName.new см .: http://api.rubyonrails.org/classes/ActiveRecord/ NestedAttributes/ClassMethods.html – plehoux

0

Не уверен, почему это не работает, но в качестве обходного пути вы можете просто использовать params [: name] в вашем контроллере # create method для обновления записи человека.

person = Person.new(params[:person]) 
person.name << PersonName.new(params[:name]) 
+0

Спасибо за ваше предложение о работе. Я могу обойти проблему с помощью active_presenter. Я пытаюсь реализовать это, используя 2.3 вложенные формы объектов правильно, чтобы я мог научиться правильно его использовать. –

+0

Прохладный. Если вы нашли решение с использованием вложенных объектных форм, возможно, вы могли бы опубликовать его, ради других? –

0

К сожалению, я до сих пор не смог понять, почему эта форма не будет работать с вложенными объектами. Я разделил его на простейшие данные, начал с использования примера сложной формы в качестве начала. Я закончил использование active_presenter для сбора данных из объекта x из формы. Я пересматриваю вложенные формы объектов когда-нибудь в форме. Спасибо за вашу помощь.

4

Попытки использовать реальный объект для form_for:

form_for :person => form_for @person 
+0

Это разрешило это в моем случае. Не уверен, почему не следует работать с символизированной нотацией ... – reto

1

Я только что боролся около часа с точно такой же проблемой!шаблон

Follow nowk для нового метода в контроллере, а затем положить это на ваш взгляд

<% form.fields_for :name, @person.name do |name_form| %> 


<% end %> 

удачи, если вы попробуете это, это то, что работает для меня.

+0

Да, именно так. Возьмите хорошего gander в документах: [поля для] (http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for) – Duke

0

Думаю, что я поделился бы своим решением, поскольку он немного отличается - в моем случае я хочу, чтобы вложенные атрибуты были динамическими.

В новой акции:

case params[:type] 
    when "clubber" 
    @account = resource.send "build_#{params[:type]}" 
    when "promoter" 
    @account = resource.send "build_#{params[:type]}" 
    when "company" 
    @account = resource.send "build_#{params[:type]}" 
    when "venue_owner" 
    flash[:notice] = 'We ask that venue owners register via the web. Thanks.' 
    redirect_to root_path and return 
    end 

На мой взгляд:

= f.fields_for @account.class.name.downcase+'_attributes' do |form| 

Довольно гетто, но это работает.

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