Почему моя форма должна содержать данные только одной модели? - PullRequest
0 голосов
/ 19 января 2019

У меня есть форма, предназначенная для отправки двух моделей, первая модель has_one другой модели, Student_Detail.

Многие пользователи здесь помогли мне с некоторыми ошибками, с которыми я уже столкнулся, и теперь моя форма отправляется успешно, но отправляет только основную модель, Participant.

Я отправил форму несколько раз, и она хранит всю информацию, которая является прямым атрибутом модели Participant.В активном администраторе данные модели Participant заполняются, но записей Student_Detail не существует.

В консоли данные Student_Detail не существуют.

Форма:

    <%= form_for @participant, url: {action: "create"} do |f| %>

                    <%= f.label :first_name, 'First:' %>
                    <%= f.text_field :first_name %>
                    <%= f.label :last_name, 'Last:' %>
                    <%= f.text_field :last_name %>
                    <%= f.label :gender, 'Sex:' %>                       
                    <%= f.select :gender, ['Male', 'Female'] %>
                    <br>
                    <br>
                    <%= f.label :birthdate, 'Birthdate:' %>
                    <%= f.date_field :birthdate %>
                    <%= f.label :email, 'Email:' %>
                    <%= f.text_field :email %>
                    <%= f.label :phone, 'Phone:' %>
                    <%= f.text_field :phone %>

                    <%= f.label :street_name, 'Street Number & Name:' %>
                    <%= f.text_field :street_name %>
                    <%= f.label :city, 'City:' %>
                    <%= f.text_field :city %>
                    <%= f.label :state, 'State:' %>
                    <%= f.text_field :state %>
                    <%= f.label :zip, 'Zip:' %>
                    <%= f.text_field :zip %>
            <!--        <%= f.label :role, 'Role:' %>
                    <%= f.select :role, ['Reader'] %> -->
                    <br>
                    <br>

         <%= f.fields_for @participant.student_detail do |student_detail_field| %>
                    <%= student_detail_field.label :nationality, 'Nationality:' %>  
                    <%= student_detail_field.text_field :nationality %>
                    <%= student_detail_field.label :religion, 'Religion:' %>
                    <%= student_detail_field.text_field  :religion  %>

                    <%= student_detail_field.label :need_ride, 'Do you need help getting to the church building?' %>
                    <%= student_detail_field.select :need_ride, ['Yes','No'] %> 
                    <br>
                    <br>
                    <%= student_detail_field.label :has_spouse, 'Marital Status:' %>
                    <%= student_detail_field.select :has_spouse, ['married', 'single'] %>
                    <br>
                    <br>
                    <%= student_detail_field.label :spouse_name, "If married, spouse's name:" %>
                    <%= student_detail_field.text_field  :spouse_name %>
                    <%= student_detail_field.label :english_level, 'English Level:' %>
                    <%= student_detail_field.select :english_level, ['Low', 'Medium Low', 'Medium', 'Medium High', 'High']  %>
                    <%= student_detail_field.label :expectation, 'What are your expectations for the program?:' %>
                    <%= student_detail_field.text_area :expectation %>
                    <%= student_detail_field.label :length_of_stay, 'About how long will you be in town?:' %>
                    <%= student_detail_field.select :length_of_stay, ['Less than 1 Year', '1 Year', '1-2 Years', '2-3 Years', '3+ Years'] %>
                    <%= student_detail_field.label :exact_length, 'Please tell us exactly how long you plan to be in town:' %>
                    <%= student_detail_field.text_area :exact_length %>
        <% end %>



Модели:

    class Participant < ApplicationRecord
    validates :last_name, presence: true
    # validates :gender, inclusion: { in: %w(male female) }
    validates :phone, presence: true
    has_one :volunteer_detail, :dependent => :destroy
      accepts_nested_attributes_for :volunteer_detail,   :allow_destroy => :true

    has_one :student_detail, :dependent => :destroy
      accepts_nested_attributes_for :student_detail,   :allow_destroy => :true

     end

-

     class StudentDetail < ApplicationRecord
belongs_to :participant
  end

Контроллер:

                    class ParticipantsController < ApplicationController
            def new
            @participant= Participant.new
            @studentdetail= @participant.build_student_detail(participant: @participant)
            end



            def create
            @participant = Participant.create(participant_params)
            @participant.save
            if @participant.save
            flash[:success] = "Successfully Registered!"        

            #email notifes admin of new registration
            NotifyMailer.notify_email(@participant).deliver_later

            redirect_to '/signup'
            end
            end

            def edit
            end

            def update
            end

            def show
            end

            def index
            end

            private
            def participant_params
            params.require(:participant).permit(:first_name, :last_name, :gender, :email, :birthdate, :phone, 
              :street_name, :city, :state, :zip, student_detail_attributes: [:nationality, :religion, :need_ride, 
            :has_spouse, :spouse_name, :english_level, :expectation, :length_of_stay, :exact_length, :volunteer_id, 
            :matched, :returned_home, :participant_id])

            end


            end

Любойпредложения или советы приветствуются, я пытаюсь заставить обе модели заполняться данными при отправке формы, и в настоящее время работает только основная модель.

1 Ответ

0 голосов
/ 20 января 2019

Я считаю, что проблема здесь в синтаксисе вашей строки fields_for в вашем представлении.

Изменение f.fields_for @participant.student_detail do |student_detail_field|

К f.fields_for :student_detail, @participant.student_detail do |student_detail_field|

Я бы поспорил, если бы вы поместили в свой контроллер оператор binging.pry или put, чтобы увидеть ваши параметры, которые student_detail_attributes даже не получают в ваши параметры. Вы можете просто вставить puts params.inspect в свой контроллер, чтобы проверить, поступают ли параметры так, как вы ожидаете. Ваш синтаксис строгих параметров выглядит корректно, как и модели, поэтому я думаю, что это проблема с вашими взглядами.

EDIT

Вот еще пара вещей, которые стоит попробовать. Как я уже упоминал в своем комментарии, я бы обычно не делал

@participant = Participant.create(participant_params)

Я бы просто сделал:

@participant = Participant.new(participant_params)
if @participant.save
#etc
end

Выше также немного очистит ваш код. (Также я заметил, что у вас нет случая в этом действии, что делать, если участник не сохраняет - в качестве примечания вы должны написать некоторый код, чтобы справиться с этим)

Также, если ни один из вышеперечисленных способов не работает, иногда я принимаю с accept_nested_attributes, что я должен установить модели как "обратные" друг другу. См. Эту статью для получения дополнительной информации: https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through - это о has_many, но я думаю, что это также должно относиться к has_one - попробуйте в модели участника:

has_one :student_detail, :dependent => :destroy, inverse_of: :participant

Посмотрите, получит ли указанное выше (или их комбинацию) сохранение вложенной модели.

...