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 ответа:
Я думаю, что вы неправильно строите свою вложенную форму:
#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 %>
Вам нужно сделать следующее:
Вид
Это создаст элементы формы с правильными данными, но я также думаю, что ваша обработка данных может быть улучшена. Поскольку вы находитесь на Rails 3, я подожду комментария, чтобы узнать, хотите ли вы, чтобы я написал для него код!<%= 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 %>
Эпизод 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 ). теперь это сработало:)