【问题标题】:RoR edit value of join table from nested formRoR 从嵌套形式编辑连接表的值
【发布时间】:2016-01-12 00:15:32
【问题描述】:

我是 Ror 的菜鸟。 3 天来一直在寻找我的问题答案,我一直在寻找答案,但找不到与我的具体问题相关的答案。 (我什至发现很难写出正确的标题)

所以我一直在尝试在 RoR 中构建嵌套表单。我有一个简单的订单表格,使用户能够在该表格中指定他们订购的数量。如果数量文本字段不为空,表单只会将值存储到数据库中。

订购单如下所示:

我将数量数据存储到订单和库存之间的连接表中,该连接表通过 Inventory_orders 表具有多对多关系。现在在 Inventory_orders 表中,而不是只有 orders_id 和 inventory_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

现在,当创建新的 Orders 表单时,应用程序可以工作并将我想要的数据存储在 inventory_orders 表中。

当我尝试编辑表单时出现问题。当试图点击编辑按钮时,我在我的视图文件中得到这个输出:

例如,这是我在表单中输入的内容:

当我尝试编辑表单时,这是我得到的:

这是我的编辑控制器:

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

 end

我一直在通过手动执行 sql 查询来查看 psql 数据库架构,如下所示:

select * from inventory_orders where inventory_orders.order_id = 63;

并得到这个结果:

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

对不起,帖子太长了,否则我不知道如何清楚地传达我的意思。

已编辑 这显示我的库存模型:

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

【问题讨论】:

  • 尝试将代码 fields_for 代码放在 &lt;% @inventories_list.each do |t| %&gt; 块之外
  • Pavan 但我需要inventory_id 来存储product_id 的值。如果如果将 fields_for 放在 阻止我将无法获取 product_id 否?

标签: ruby-on-rails nested-forms has-many-through form-for


【解决方案1】:

您需要使用以下内容:

//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 %>

【讨论】:

  • 您好,感谢您的帮助,我已将代码更改为您的建议(编辑前),但如果我使用关联数据的实例(在本例中为' ,那么 't' 将引用 @inventories_list 控制器,它将获取所有库存模型数据,对吗?)。因为我的库存表中没有“数量”列,所以它给了我这个“#<0x007f877e7205d0>
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多