2015-01-14 47 views
1

我试图创建一个既可以更新'Invite'又可以添加一个新'Guest'(嵌套窗体)的窗体。邀请has_many'Guests'和'Guests'属于'Invites'。我已经设置了accepts_nested_attributes_for,但我无法获得添加新“访客”的表单。Rails:嵌套模型表单不创建记录

目前的从可以更新邀请,但只是引导到“显示”的观点,但添加新客户记录。我不知道为什么。我有一种感觉它有什么做的邀请 '更新' 的方法......

下面是一些代码:

邀请型号:

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 

我猜这是什么做的控制器的方法,但我无法弄清楚什么?

任何帮助赞赏...

+0

你可以使用宝石nested_form或宝石茧 –

回答

2

首先,您需要将您的参数声明移动到您的邀请控制器,Rails 4希望它们是。

你PARAMS将需要采取嵌套属性在一个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 
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 
+0

我打算在此之前对此进行评论,以便您修复您最初编写的参数散列的“图层”,但希望我的回答能帮助您,而不是:) –

相关问题