我一直在努力获得嵌套表单来保存用户的输入。"外部"形式完美地保存了信息。"内部"或嵌套的值创建一个新对象,并传递隐藏的字段信息,但所有其他值都是"nil"。
每个订单都有一个或多个date_order,您应该能够通过此表单创建第一个订单
我的代码如下。请帮我找出可能导致这种情况的原因。我已经广泛浏览了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-->路线中未提及日期订单。这是个问题吗?
订单/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 %>
EDIT:创建的哈希示例:
<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`
关于如何调试这些类型的问题的一些想法:
- 查看服务器日志(运行
rails s
的终端窗口)。如果强参数permit
删除了不允许的属性,您将看到一条警告。确保您没有任何打字错误,例如在您的案例中(使用date_order_attributes
而不是date_orders_attributes
) - 在UI中提交无效的表单输入,查看服务器日志并找到正在发送的
params
哈希。然后,只需转到控制台并将发送到Order.new
的params散列中的相关密钥粘贴即可调试代码。例如:Order.new(params['order'])
我会在你的代码中做一些更改:
- 从
#create
操作中删除@order.date_orders.build
。这对于#new
显示空日期顺序是有用的,但对于想要完全依赖用户输入的#create
则不然 - 卸下
<%= builder.hidden_field :order_id, :value => @order.id %>
。Rails不需要它。当你告诉Railsaccepts_nested_attributes_for :date_orders
时,它只是在你的模型中添加了一个默认的date_orders_attributes=
方法。当您向Order.new(hash)
发送一个看起来像hash = {order_title: 'my_title', date_orders_attributes: {order_date: '...'}}
的哈希时,ActiveRecord会将该哈希的date_orders_attributes
部分发送到新创建的订单实例上的方法。也就是说,此方法已经知道您的子日期订单属于订单实例,因此没有必要