2015-10-14 60 views
1

我是Ror的noob。一直在寻找我3天的问题答案,我一直在寻找答案,但无法找到一个与我的具体问题。 (我甚至发现很难写出正确的标题)RoR从嵌套形式编辑连接表的值

所以我一直试图在RoR中构建一个嵌套窗体。我有一个简单的订单,可以让用户指定他们在这种形式下订购的数量。如果数量文本字段不为空,表单将只将值存储到数据库中。

邮购表格仅仅是这样的:

oder form

我保存订单和库存其中有许多通过Inventory_orders表中的许多关系之间的量数据到连接表。现在在Inventory_orders表中,而不是只有orders_id和inventories_id,我也添加了数量列。

现在我已经能够获取表单与下面的代码工作: 控制器:

def new 
    @order = Order.new 
    @customer = Customer.all 
    @inventories_list = Inventory.all 
    @inventory_order = @order.inventory_orders.build 
    end 

    def create 

    @order = Order.new(order_params) 
    @inventories_list = Inventory.all #controller can call any model 

    respond_to do |format| 
     if @order.save 
     format.html { redirect_to @order, notice: 'Order was successfully created.' } 
     format.json { render :show, status: :created, location: @order } 
     else 
     format.html { render :new } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

def order_params 
     params.require(:order).permit(:customer_id, :order_ids => [],:inventory_orders_attributes => [:id, :quantity, :inventory_id ]) 
    end 

查看:

<%= form_for(@order) do |f| %> 
<div id = “Main_Container"> 
*** Some Code *** 
       <table id = "inventory_table"> 
        <tr> 
        <td class = "prodCodeTitle"><h3>Prod Code</h3></td> 
        <td class = "prodResult"><h3>Quantity</h3></td> 
        <td class = "prodResult"><h3>Size</h3></td> 
        <td class = "prodResult"><h3>Price</h3></td> 
        </tr> 

//Here display all the inventories list 
<% @inventories_list.each do |t| %> 
        <tr> 

        <td class ="prodResult"><%= link_to t.pName, inventory_path(t), :remote => true %></td> 
        <td class = “prodResult"> 
     //nested form for the join table 
         <%= f.fields_for :inventory_orders do |qty| %> 
         <%= qty.hidden_field :inventory_id , value: t.id %> 
         <%= qty.number_field :quantity %> 
        <%end%> 
        </td> 
        <td class = "prodResult"><%= t.pMeter %></td> 
        <td class = "prodResult"><%= t.pSellPrice %></td> 

        </tr> 
        <% end %> 
      *** Some Code*** 
<% end %> 

型号:

class Order < ActiveRecord::Base 
    belongs_to :customer 
    has_many :inventory_orders 
    has_many :inventories, through: :inventory_orders 
    validates :customer_id, :presence => true 

    accepts_nested_attributes_for :inventory_orders, :reject_if => lambda { |a| a[:quantity].blank?} 

end 

class InventoryOrder < ActiveRecord::Base 
    belongs_to :inventory 
    belongs_to :order 


    validates :quantity, :presence => true 
end 

现在,当创建新订单“窗体中,应用程序在inventory_orders表中存储我想要的数据。

当我尝试编辑表单时发生问题。当试图点击编辑按钮,我得到了我的视图文件输出:

例如这是我投入的形式: enter image description here

当我尝试编辑这个形式是什么,我得到:

enter image description here

这是我的编辑器:

def edit 
    @order = Order.find(params[:id]) 
    @customer = Customer.all 
    @inventories_list = Inventory.all 

end 

I H我一直在寻找psql数据库架构手动做SQL查询如下:

select * from inventory_orders where inventory_orders.order_id = 63;

,并得到这个结果为: enter image description here

现在看来,fields_for Inventory_orders获得的行数返回,但我不明白为什么所有的数量也得到显示4次,每次产品。另外,如何确保当我尝试编辑产品“aaa”的数量时,它只会显示一个用户之前输入的number_field。

对不起,我不知道如何清楚地传达我的意思。

EDITED 这表明我的库存模型:

Class Inventory < ActiveRecord::Base 
    has_many :inventory_orders 
    has_many :orders, through: :inventory_orders 
end 
+0

尝试把代码'fields_for'代码'<%@ inventories_list.each外面做| T | %>'块 – Pavan

+0

Pavan,但我需要inventory_id来存储product_id的值。如果将fields_for放在<%@ inventories_list.each do | t |之外%>块我将无法获得product_id否? – Hans

回答

0

您需要使用以下方法:

//Here display all the inventories list 
<% @inventories_list.each do |t| %> 
    <%= link_to t.pName, inventory_path(t), :remote => true %> 
    <%= f.fields_for :inventory_orders, t do |qty| %> 
      <%= qty.hidden_field :inventory_id , value: t.id %> 
      <%= qty.number_field :quantity %> 
    <% end %> 
    <%= t.pMeter %> 
    <%= t.pSellPrice % 
<% end %> 

的问题是,由于f.fields_for填充建立了基于该形式关联的对象,如果您通过edit动作传递4个完全构造的对象,则可以使用fields_for将每次都填充全部。您需要的是使用instance of the associated data


我觉得你的代码可以改善了很多:

#app/controllers/orders_controller.rb 
class OrdersController < ApplicationController 
    def new 
     @order = Order.new 
     @inventory = Inventory.all 
     @inventory_order = @order.inventory_orders.build 
    end 

    def edit 
     @order = Order.find params[:id] 
     @inventory = Inventory.all 
    end 
end 

#app/views/orders/new.html.erb 
<%= form_for @order do |f| %> 
    <% @inventory.each do |inventory| %> 
     <%= f.fields_for :inventory_orders, item do |item| %> 
      <%= item.text_field :quantity %> 
     <% end %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

#app/views/orders/edit.html.erb 
<%= form_for @order do |f| %> 
    <%= f.fields_for @order.inventory_orders do |item| %> 
     <%= item.text_field :quantity %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 
+0

嗨,感谢您的帮助,我已经改变了代码作为您的建议(在编辑之前),但得到了一个错误,如果我使用相关数据的实例(在这种情况下是't',那么't'会请参阅@inventories_list控制器,它将获得所有库存模型数据?)。因为我的库存表中没有'数量'栏,所以为了清除“<%= qty.hidden_​​field:inventory_id,value:”,为此给出了这个“未定义的方法'数量”#“ – Hans

+0

” t.id%>“?我需要这个代码来获取inventory_id,这样我可以将它插入到inventory_orders表中 – Hans