【问题标题】:Rails - Nested Forms will create, but information won't be savedRails - 将创建嵌套表单,但不会保存信息
【发布时间】:2016-04-29 23:04:18
【问题描述】:

我一直在努力让我的嵌套表单来保存用户的输入。 “外部”表格完美地保存了信息。 “内部”或嵌套的创建一个新对象,并传递隐藏字段信息,但所有其他值都是“nil”。

每个订单都有一个或多个 date_orders,您应该可以通过此表单创建第一个。

我的代码如下。请帮我找出可能导致这种情况的任何原因。我已经广泛浏览了 StackOverflow。

orders_controller.rb

class OrdersController < ApplicationController

def new
    @order = Order.new
    @order.date_orders.build
end

def create
    @order = Order.new(order_params)
    @order.date_orders.build
    if @order.save
        flash[:success] = "Success"
        redirect_to current_user
    else
        render 'new'
    end
end

def order_params
    params.require(:order).permit(
        :user_id, :description, date_order_attributes: 
            [:id, :order_date, :time_start, :time_end, :order_id])
end
end

order.rb

class Order < ActiveRecord::Base
    has_many :date_orders, :dependent => :destroy
    accepts_nested_attributes_for :date_orders
end

date_order.rb

class DateOrder < ActiveRecord::Base
    belongs_to :order
end

routes.rb --> 路线中没有提到 date_orders。有问题吗?

orders/new.html.erb

<%= form_for(@order, :html => {:multipart => true}) do |f| %>
<!-- form_for fields FIELDS -->
<%= fields_for :date_orders do |builder| %>

    <%= builder.hidden_field :order_id, :value => @order.id %> <- THIS WORKS

    <%= builder.label :date %>
    <%= builder.date_field :order_date %>

    <%= builder.label :starting_time %>
    <%= builder.time_field :time_start %>

    <%= builder.label :ending_time %>
    <%= builder.time_field :time_end %>


<% end %>
<%= f.submit "Request", class: "btn" %>
<% end %>

编辑:创建的哈希示例:

<DateOrder id: 9, order_date: nil, time_start: nil, time_end: nil, order_id: 29, created_at: "2016-04-29 22:43:18", updated_at: "2016-04-29 22:43:18">enter code here`

【问题讨论】:

  • #create 操作中的 @order.date_orders.build 是不必要的。它从头开始构建一个新对象,这不是您想要的 - 您只想保存用户输入。您能否在此处粘贴 params 哈希的示例,该哈希在您无法正常工作的 UI 输入中提交后,#create 操作收到?
  • 另外,你不需要隐藏字段。
  • 哦,permit 中有错字。它应该是复数形式的date_orders_attributes。请查看服务器日志rails s 不断吐出 - 所有不允许的属性都应收到警告。确保你没有。
  • 刚刚添加了一个已创建的哈希。
  • 我的意思是 params 散列控制器操作 #create 接收,而不是新创建的日期订单对象。

标签: ruby-on-rails forms nested-forms fields-for nested-form-for


【解决方案1】:

关于如何调试此类问题的一些想法:

  1. 查看服务器日志(运行rails s 的终端窗口)。如果强参数permit 丢弃了不允许的属性,您会在此处看到警告。确保您没有任何拼写错误,例如您的情况(使用 date_order_attributes 而不是 date_orders_attributes)。
  2. 在 UI 中提交表单输入不起作用,查看服务器日志并找到正在发送的 params 哈希。然后,您可以通过简单地转到控制台并从您发送到Order.new 的参数哈希中粘贴相关键来调试您的代码。例如:Order.new(params['order'])

我将对您的代码进行一些更改:

  1. #create 操作中删除@order.date_orders.build。这对于 #new 显示空日期顺序很有用,但在您希望完全依赖用户输入的 #create 中则不然。
  2. 删除&lt;%= builder.hidden_field :order_id, :value =&gt; @order.id %&gt;。 Rails 不需要它。当您告诉 rails accepts_nested_attributes_for :date_orders 时,它只是为您的模型添加了一个默认的 date_orders_attributes= 方法。当您将类似于hash = {order_title: 'my_title', date_orders_attributes: {order_date: '...'}} 的哈希发送到Order.new(hash) 时,ActiveRecord 会将哈希的date_orders_attributes 部分发送到在该新创建的订单实例上 的该方法。即这个方法已经知道你的子日期订单属于订单实例,所以没有必要。

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多