【问题标题】:Why would my form submit only one model's data?为什么我的表单只提交一个模型的数据?
【发布时间】:2019-01-19 04:42:27
【问题描述】:

我有一个打算提交两个模型的表单,第一个模型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

感谢您提出任何建议或意见,我正在尝试在提交表单时让两个模型都填充数据,目前主要模型是唯一有效的模型。

【问题讨论】:

  • 对学生详细信息使用 has_many 关联。
  • 你能解释一下为什么吗?每个 Participant 只有一个 Student_Detail。

标签: ruby-on-rails form-for fields-for


【解决方案1】:

我认为这里的问题在于您视图中 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 或 puts 语句来查看你的参数,student_detail_attributes 甚至都没有到达你的参数。您只需在控制器中插入 puts params.inspect 即可检查参数是否按预期通过。您强大的参数语法看起来像模型一样正确,所以我认为这是您的观点的问题。

编辑

这里还有一些其他的尝试。正如我在评论中提到的,我通常不会这样做

@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 相关 -- 在 Participant 模型中尝试:

has_one :student_detail, :dependent =&gt; :destroy, inverse_of: :participant

查看上述任何一个(或两者的组合)是否可以保存嵌套模型。

【讨论】:

  • 听从了您的建议,但是我的控制台显示了所有字段的参数,然后只显示了插入数据库的参与者数据。你有什么理由认为有些人不会提交吗?
  • 这是另一个想法——通常当我在控制器的创建操作中执行嵌套属性保存时,我不会调用类似“Participant.create(participant_params)”之类的东西,我会执行“Participant.new(参与者参数)”——我会更新我的答案
  • 谢谢,我今天晚些时候试试,告诉你进展如何。
  • 刚刚更新了我的答案,增加了两件事供您尝试 - 让我知道这是否能奏效 - nested_attributes_for 可能很棘手
  • 我添加了您的两个建议 - 将“.create”更改为“.new”,我还添加了 inverse_of。这解决了它,现在两个模型都在表单提交中填充。谢谢!!
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 2010-10-17
  • 2019-03-04
  • 1970-01-01
  • 2012-03-07
  • 2014-04-08
相关资源
最近更新 更多