【问题标题】:Rails: Nested model form not creating recordRails:嵌套模型表单不创建记录
【发布时间】:2015-01-15 00:24:40
【问题描述】:

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

目前来自可以更新邀请,但只是指向“显示”视图,但添加新的访客记录。我不知道为什么。我感觉它与 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

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

任何帮助表示赞赏...

【问题讨论】:

  • 你可以使用 gem nested_form 或 gem cocoon

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


【解决方案1】:

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

您的参数需要在单个参数调用中获取嵌套属性。如果这令人困惑,请查看 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我之前打算对此发表评论,让您修复您最初编写的参数哈希的“层”,但希望我的回答对您有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多