500 Внутренняя ошибка сервера при отправке вложенной формы в Rails


Я получаю 500 внутренних ошибок сервера, когда я отправляю вложенную форму, которая имеет две модели-Member и ChildrenInformation.

Ошибка:

500 Внутренняя Ошибка Сервера

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

Я проверил файл журнала, и вот что я обнаружил:

TypeError (ожидаемый хэш (получен Массив) для параметра 'child_info_attrib'):

Вот другие части моего проекта rails

вид (новый.формат html.erb>

  <%= form_for(@member) do |f| %>
 <div class="field">
    <%= f.label :gender, "Gender" %><br />
    <%= f.select :gender, options_for_select(["Male", "Female"]) %>
  </div>
 <div class="field">
    <%= f.label :fname, "First Name" %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :age, "Age" %><br />
    <%= f.text_field :age %>
  </div>
   <div class="field">
    <%= f.label :membership_id, "Membership ID" %>
    <%= f.text_field :membership_id %>
  </div>
  <div class="field">
    <%= f.label "Branch" %>
    <%= f.collection_select(:branch_id, Branch.all, :id, :name) %>
  </div>
  <% for children_information in @member.children_informations %>
     <%= fields_for "member[child_info_attrib][]", children_information do |children_info_form| %>
      <div class="field">
        <%= children_info_form.label :name, "Name" %><br />
        <%= children_info_form.text_field :name %>
      </div>
      <div class="field">
        <%= children_info_form.label :gender, "Gender" %><br />
        <%= children_info_form.select :gender, options_for_select(["Male", "Female"]) %>
      </div>
      <div class="field">
        <%= children_info_form.label :birthdate, "Birthdate" %><br />
     nn <%= children_info_form.datetime_select :birthdate, :discard_hour => true, 
:order => [:month, :day, :year], :start_year => 1900 %>
        </div>
   </div>
       <% end %>
    <% end %>`

Модель (Член)

 class Member < ActiveRecord::Base
    has_many :children_informations

    def child_info_attrib=(attribs)
        attribs.each do |attrib|
          children_informations.build(attrib)
        end
    end 
 end

Модель (ChildrenInformation)

class ChildrenInformation < ActiveRecord::Base
    belongs_to :member
end

Контроллер (MembersController)

class MembersController < ApplicationController
def new
    @member = Member.new
    @member.children_informations.build

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @member }
    end
  end
def create
    @member = Member.new(params[:member])
    respond_to do |format|
      if @member.save
        format.html { redirect_to(@member, :notice => 'Member was successfully created.') }
        format.xml  { render :xml => @member, :status => :created, :location => @member }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @member.errors, :status => :unprocessable_entity }
      end
    end
  end

журнал разработки: http://pastebin.com/n9E2nyFv (таблица членов имеет много полей)

То, что я пытался до сих пор, это опустить вложенная форма, и это действительно сработало.
Кроме того, я основал этот способ использования вложенной формы через RailsCasts (http://railscasts.com/episodes/73-complex-forms-part-1).

Как я могу успешно отправить его с вложенной формой?

Заранее благодарю вас! :)

3 3

3 ответа:

Я думаю, что вы неправильно строите свою вложенную форму:

#app/views/members/new.html.erb
 <% for children_information in @member.children_informations %>
     <%= fields_for "member[child_info_attrib][]", children_information do |children_info_form| %>
      <div class="field">
        <%= children_info_form.label :name, "Name" %><br />
        <%= children_info_form.text_field :name %>
      </div>
      <div class="field">
        <%= children_info_form.label :gender, "Gender" %><br />
        <%= children_info_form.select :gender, options_for_select(["Male", "Female"]) %>
      </div>
      <div class="field">
        <%= children_info_form.label :birthdate, "Birthdate" %><br />
     nn <%= children_info_form.datetime_select :birthdate, :discard_hour => true, 
:order => [:month, :day, :year], :start_year => 1900 %>
        </div>
   </div>
       <% end %>
  <% end %>

Вам нужно сделать следующее:

Вид

<%= f.fields_for :children_informations do |children_info_form| %>
      <div class="field">
        <%= children_info_form.label :name, "Name" %><br />
        <%= children_info_form.text_field :name %>
      </div>
      <div class="field">
        <%= children_info_form.label :gender, "Gender" %><br />
        <%= children_info_form.select :gender, options_for_select(["Male", "Female"]) %>
      </div>
      <div class="field">
        <%= children_info_form.label :birthdate, "Birthdate" %><br />
     nn <%= children_info_form.datetime_select :birthdate, :discard_hour => true, 
:order => [:month, :day, :year], :start_year => 1900 %>
        </div>
   </div>
<% end %>
Это создаст элементы формы с правильными данными, но я также думаю, что ваша обработка данных может быть улучшена. Поскольку вы находитесь на Rails 3, я подожду комментария, чтобы узнать, хотите ли вы, чтобы я написал для него код!

Эпизод railscast, за которым вы следуете, датирован 2007 годом. Я не думаю, что этот подход является лучшим при создании вложенных форм.

Это

def child_info_attrib=(attribs)
    attribs.each do |attrib|
      children_informations.build(attrib)
    end
end

Можно упростить до этого (если вы используете rails 3.x >)

Attr_accessible :childs_attributes
accepts_nested_attributes_for: childs

Если вы хотите ссылки или некоторые учебные пособия, чтобы следовать я бы рекомендовал
http://railscasts.com/episodes/196-nested-model-form-revised
http://railscasts.com/episodes/197-nested-model-form-part-2

Или, если у вас их нет, вы можете посмотреть на этот камень.
https://github.com/nathanvda/cocoon
это упрощает то, чего вы пытаетесь достичь.

Это была ошибка, что я испортил заметку эпизода RailsCasts о вложенных формах (http://railscasts.com/episodes/73-complex-forms-part-1 ), что он устарел, и я должен вместо этого следовать последнему эпизоду упомянутой темы (http://railscasts.com/episodes/196-nested-model-form-part-1 ). теперь это сработало:)