Rails - 嵌套表单将创建,但不会保存信息



我一直在努力获得嵌套表单来保存用户的输入。"外部"形式完美地保存了信息。"内部"或嵌套的值创建一个新对象,并传递隐藏的字段信息,但所有其他值都是"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`

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

  1. 查看服务器日志(运行rails s的终端窗口)。如果强参数permit删除了不允许的属性,您将看到一条警告。确保您没有任何打字错误,例如在您的案例中(使用date_order_attributes而不是date_orders_attributes
  2. 在UI中提交无效的表单输入,查看服务器日志并找到正在发送的params哈希。然后,只需转到控制台并将发送到Order.new的params散列中的相关密钥粘贴即可调试代码。例如:Order.new(params['order'])

我会在你的代码中做一些更改:

  1. #create操作中删除@order.date_orders.build。这对于#new显示空日期顺序是有用的,但对于想要完全依赖用户输入的#create则不然
  2. 卸下<%= builder.hidden_field :order_id, :value => @order.id %>。Rails不需要它。当你告诉Rails accepts_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部分发送到新创建的订单实例上的方法。也就是说,此方法已经知道您的子日期订单属于订单实例,因此没有必要

相关内容

  • 没有找到相关文章

最新更新