3

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

Ошибка:

500 Internal Server Error

If you are the administrator of this website, then please read this web application's log file and/or the web server's log file to find out what went wrong.

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

TypeError (expected Hash (got Array) for param `child_info_attrib'):

Вот другие части мои рельсы проекта

View (new.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 

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

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

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

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

ответ

4

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

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

+0

Hi @rich peck. Я попробовал ваш ответ, и он успешно отправил форму. Но когда я проверил базу данных, все поля имеют NULL, но есть записи. – alucillo36

+0

Это означает, что мы не обрабатываем их должным образом, когда они идут к модели - есть ли у вас журнал доступных параметров? –

+0

Как получить параметры? – alucillo36

1

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

этого

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

может быть упрощено до этого (если вы используете направляющие 3.х>)

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
, который упрощает то, чего вы пытаетесь достичь.

+0

hi @rav спасибо за что :) это было довольно напоминанием для использования обновленного railscast. – alucillo36

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