在Rails上使用简单表单创建多个记录

时间:2016-08-26 22:50:57

标签: ruby-on-rails ruby ruby-on-rails-3

我正在创建一个库存应用,其中一个功能是批量更改库存,因此当您转到Stocks链接时,它会显示包含2个字段INs的完整项目列表和OUTs,一旦用户完成并保存,它将存储在stock表中(其中包含IN OUT和item_id字段,以及created_at和updated_at)

到目前为止,我一直在努力解决这个问题,因为我所看到的所有例子都更多地关注物品本身而不是库存部分(就我的情况而言)

这是我到目前为止所拥有的:

这是stock文件夹中的_form.erb

<% @items.each do |item| %>
 <%= form_for item do |f| %>
  <%= f.fields_for :stocks, [Stock.new] do |stock| %>
   <%= f.label item.nombre %>
   Altas <%= stock.text_field :altas %>
   Bajas <%= stock.text_field :bajas %>
   <%= stock.hidden_field :items_id, :value => item.id %>
   <% end %>
  <%= f.submit %>
 <% end %>
<% end %>

除了控制器上的脚手架外,我没有做任何事情

并且模型有:  stock.rb

class Stock < ActiveRecord::Base
 belongs_to :items
end

item.rb的

class Item < ActiveRecord::Base
 has_many :stocks
 attr_accessible :nombre, :espesor, :material, :quantity
 accepts_nested_attributes_for :stocks
 attr_accessible :stocks_attributes
 self.per_page = 50

 protected
end

到目前为止,运行此代码,将显示每个项目名称和两个字段,但每个项目的更新按钮,运行代码将在控制器中给我一个错误

unknown attribute 'item_id' for Stock.

以下的参数是我得到的:

{"utf8"=>"✓",
"_method"=>"patch",
   "authenticity_token"=>"xAdfWBvf4MdkeiZ8xR5ElkNaMMTB5ySt1C9nCG5iGw2hwgDs1MJ2luLH2slvaEEIQBgjac4+RkxZIg6InIbZ1A==",
"item"=>{"stocks_attributes"=>{"0"=>{"altas"=>"7",
"bajas"=>"8",
"items_id"=>"4"}}},
"commit"=>"Update item",
"id"=>"4"}

所以它只存储一个值而不是全部4个(在这种情况下是4个项目)

这是架构:     ActiveRecord :: Schema.define(版本:20160824232702)做

create_table "items", force: :cascade do |t|
 t.string   "nombre"
 t.integer  "espesor"
 t.string   "material"
 t.integer  "quantity"
 t.datetime "created_at"
 t.datetime "updated_at"
end

create_table "stocks", force: :cascade do |t|
 t.integer  "altas"
 t.integer  "bajas"
 t.integer  "items_id"
 t.datetime "created_at", null: false
 t.datetime "updated_at", null: false
end

add_index "stocks", ["items_id"], name: "index_stocks_on_items_id"

create_table "users", force: :cascade do |t|
 t.string   "name",                               null: false
 t.string   "email",                              null: false
 t.string   "encrypted_password",                 null: false
 t.string   "reset_password_token"
 t.datetime "reset_password_sent_at"
 t.datetime "remember_created_at"
 t.integer  "sign_in_count",          default: 0
 t.datetime "current_sign_in_at"
 t.datetime "last_sign_in_at"
 t.string   "current_sign_in_ip"
 t.string   "last_sign_in_ip"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.integer  "role"
end

add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name:     "index_users_on_reset_password_token", unique: true

end

2 个答案:

答案 0 :(得分:1)

好的,这是我如何解决它,所以它可能在将来有所帮助

这是表单文件:

<div class="panel-body">
  <div class="row">
    <table class="table table-hover">
      <thead class="warning">
       <th><center>Color</center></th>
       <th><center>Material</center></th>
       <th><center>Espesor</center></th>
       <th><center>Altas</center></th>
       <th ><center>Bajas</center></th>
      </thead>
   <%= form_tag stocks_path  do %>

   <% @items.each do |item| %>
   <%= fields_for 'data[]', @stock do |stock| %>
   <tbody>
  <tr>
  <td><%= item.nombre %></td>
  <td><center><%= item.material %></center></td>
  <td><center><%= item.espesor %></center></td>
  <td><center><%= stock.text_field :altas %></center></td>
  <td><center><%= stock.text_field :bajas %></center></td>
  <%= stock.hidden_field :item_id, :value => item.id %>
 <% end %>

<% end %>
</tr>
</tbody>
</table>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-5">
<%= submit_tag "Update", class: "btn btn-primary" %>
<% end %>
</div>
</div>

这就是控制器的工作方式

  @stock = Stock.create(my_params(d))
   if @stock.altas == nil && @stock.bajas == nil
   @stock.destroy
   else
   @stock.save

   end
 @item = Item.find(@stock.item_id)
  if @stock.altas != nil
   @item.quantity =  @stock.item.quantity + @stock.altas
  end
  if @stock.bajas != nil
   @item.quantity = @stock.item.quantity - @stock.bajas
  end
  @item.save
 end

  redirect_to stocks_url, notice: 'Stock was successfully created.'

end

一切正常,它也会减少并增加总量

答案 1 :(得分:0)

如何修复未知属性错误

  

Stock的未知属性'item_id'。

这基本上意味着rails正在寻找stock表中的“item_id”列。添加它,它应该工作。您必须使用迁移重命名该列。