我正在创建一个库存应用,其中一个功能是批量更改库存,因此当您转到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
答案 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”列。添加它,它应该工作。您必须使用迁移重命名该列。