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
我正在尝试创建一个既可以更新 '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