Rails: 嵌套模型表单未创建记录

Rails: Nested model form not creating record

我正在尝试创建一个既可以更新 'Invite' 又可以添加新 'Guest' 的表单(嵌套表单)。一个 'Invite' has_many 'Guests' 和 'Guests' belong_to 'Invites'。我已经完成设置 accepts_nested_attributes_for 但我无法获得添加新 'Guest'.

的表格

目前 可以 更新邀请,但只是指向 'show' 视图,但 不会 添加一个新的访客记录。我不确定为什么。我感觉这与 Invite 'update' 方法有关...

这是一些代码:

邀请模特:

class Invite < ActiveRecord::Base
  has_many :guests
  def invite_params

  def invite_params
    params.require(:invite).permit(:invite_code, :name)
  end

  accepts_nested_attributes_for :guests

  validates :invite_code, presence: true, numericality: true, length: { is: 4 }
  validates :name, presence: true, length: { minimum: 5 }
 end

客座模特:

class Guest < ActiveRecord::Base
  belongs_to :invite

  def guest_params
    params.require(:guest).permit(:name, :attendance_status, :starter, :main, :desert, :dietary_requirements)
  end

  validates :name, presence: true, length: { minimum: 5 }
  validates :attendance_status, presence: true
end

表格:

<%= form_for @invite, url: invite_path(@invite), method: :patch do |invite_form| %>
  <p>
    <%= invite_form.label :name %><br>
    <%= invite_form.text_field :name %>
  </p>

  etc...

  <%= invite_form.fields_for :guest do |guest_form| %>
    <h3>Add a Guest</h3>
    <p>
      <%= guest_form.label :name %><br>
      <%= guest_form.text_field :name %>
    </p>

    etc...
  <% end %>

  <%= invite_form.submit 'Update' %>

<% end %>

来宾控制器:

class GuestsController < ApplicationController
 def new
   @invite = Invite.find(params[:invite_id])
   @guest = @invite.guests.build
 end

 def create
   @invite = Invite.find(params[:invite_id])
   @guest = @invite.guests.create(guest_params)
   redirect_to edit_invite_path(@invite)
 end

 etc...

邀请管理员:

def update
 @invite = Invite.find(params[:id])

 if @invite.update(invite_params)
   redirect_to @invite
 else
   render 'edit'
 end
end

我猜这与控制器方法有关,但我不知道是什么?

感谢任何帮助...

您在使用 Rails 4 吗?如果是这样,请阅读强大的参数。在您的邀请控制器中应该看起来像这样。

private

  def invite_params
    params.require(:invite).permit(:invite_code, :name, guests_attributes:[:name, :attendance_status, :starter, :main, :desert, :dietary_requirements])
  end

首先,您需要将参数声明移动到您的邀请控制器,Rails 4 打算这样做。

您的参数需要在单个参数调用中获取嵌套属性。如果这令人困惑,请查看 this SO question 并在答案中查看如何嵌套这些属性。

确保您的表单也有 ...fields_for :guests 作为您的邀请 class has_many :guests

因此,您的 invite_params 实施最终可能看起来像这样:

def invite_params
  params.require(:invite).permit(:invite_code, :name, guests_attributes:[:name, :attendance_status, :starter, :main, :desert, :dietary_requirements])
end