【发布时间】: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