Rails 4使用accepts_nested_attributes_for时出现问题

时间:2014-06-30 17:57:16

标签: ruby-on-rails

我是rails的新手,我正在尝试使用accepts_nested_attributes_for函数。我正在创建库存系统,并且accepted_nested_attributes_for功能用于将多个订单详细信息附加到订单。订单还必须与商店位置相关联。

我遇到的问题是订单正在创建,但没有数据传递到订单明细表。

我的观点如下:

订单查看

<h1>Place An Order</h1>

<%= form_for ([@location, @order]) do |f| %>
  <p>
     <%= f.label :customer_id %><br />
    <%= f.text_field :customer_id %>
  </p>
  <p>
  <h3>Items</h3>
    <%= f.fields_for :order_details do |builder| %>
        <%= render 'order_detail_fields', :f => builder %>
    <% end %>
  </p>

  <p><%= link_to_add_fields "Add Item", f, :order_details %></p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

Order_details_fields Partial

<p class="fields">
    <%= f.label :item_id %><br />
    <%= f.text_field :item_id %></br>
    <%= f.label :quantity %></br>
    <%= f.text_field :quantity %></br>
    <%= f.label :cost %></br>
    <%= f.text_field :cost %></br>
    <%= f.label :discount %><br />
    <%= f.text_field :discount %><br />
    <%= f.hidden_field :_destroy %>
    <%= link_to_function "remove", "remove_fields(this)" %>
</p>

订单控制器

class OrdersController < ApplicationController

    def index
        @orders = Order.all
    end

    def show
        @order = Order.find(params[:id])
    end

    def new
        @order = Order.new
        @location = Location.find(params[:location_id])
    end

    def create
        @location = Location.find(params[:location_id])
        @order = @location.orders.create(order_params)  
        #@order =  @order.order_details.create

        if @order.save
            redirect_to @order
        else
            render :action => 'new'
        end
    end

    private
        def order_params
            params.require(:order).permit(:customer_id, order_detials_attributes: [:id, :item_id, :quantity, :cost, :discount])
        end

end

订单型号

class Order < ActiveRecord::Base
    belongs_to :location
    has_many :order_details, :dependent => :destroy
    accepts_nested_attributes_for :order_details, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
end

订单明细模式

class OrderDetail < ActiveRecord::Base
  belongs_to :order
end

路线

resources :locations do
      resources :orders
end

resources :orders do
      resources :order_details
end

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

<强>构建

看起来一切对我来说都是正确的 - 问题@Pavan概述的唯一问题是,当你使用accepts_nested_attributes_for时,你必须build关联对象,所以它可以使用以下形式:

#app/controllers/orders_controller.rb
Class OrdersController < ApplicationController
   def new
       @location = Location.find parmas[:id]
       @order = Order.find params[:id]
       @order.order_details.build
   end
end

虽然这看起来像是唯一的问题,但可能存在其他问题(OrderDetail模型上的验证作为示例(您没有)

我和Pavan建议的唯一问题是,如果您不构建关联数据,fields_for不会在表单上显示。如果您的字段正在显示,则可能是另一个问题,该问题将在params哈希

中突出显示