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

时间:2015-01-14 15:05:47

标签: ruby-on-rails ruby-on-rails-4

我正在尝试创建一个既可以更新“邀请”又可以添加新的“访客”(嵌套表单)的表单。 '邀请'has_many'来宾'和'来宾'属于'邀请'。我已经完成了accepts_nested_attributes_for的设置,但我无法通过表单添加新的“访客”。

目前可以更新邀请,但只是指向“展示”视图,但不会添加新的访客记录。而且我不确定为什么。我觉得它与邀请'更新'方法有关...

以下是一些代码:

邀请模特:

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

我猜这是与控制器方法有关但我无法弄清楚是什么?

任何帮助表示赞赏...

2 个答案:

答案 0 :(得分:2)

首先,您需要将params声明移动到您的邀请控制器,Rails 4打算将它们放在那里。

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

确保您的表单也有...fields_for :guests作为您的邀请类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

答案 1 :(得分:0)

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

private

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