【发布时间】:2014-01-16 15:45:01
【问题描述】:
我有一个 PurchaseOrder 模型和一个 Item 模型通过 has_many 加入到一个 Quantity 模型中。
purchase_order.rb
class PurchaseOrder < ActiveRecord::Base
has_many :quantities, dependent: :destroy
has_many :items, :through => :quantities
accepts_nested_attributes_for :quantities, :reject_if => :all_blank, :allow_destroy => true
item.rb
class Item < ActiveRecord::Base
has_many :quantities, dependent: :destroy
has_many :purchase_orders, through: :quantities
accepts_nested_attributes_for :item, :reject_if => :all_blank
数量.rb
class Quantity < ActiveRecord::Base
belongs_to :purchase_order
belongs_to :item
Quantity 连接模型有一个称为“金额”的额外属性:
Quantity id: nil, amount: nil, purchase_order_id: nil, item_id: nil
在新的 PurchaseOrder 表单中,我想在 Quantity 连接表中为创建的每个新项目设置金额。我相信我几乎可以使用它,但是在保存新的 PurchaseOrder 时出现错误,上面写着Unpermitted parameters: quantity
这是我的新 PurchaseOrder 表单中的代码:
<%= f.fields_for @q do |quantity| %>
<%= quantity.number_field :amount %><br>
<% end %>
我使用的是 rails 4,所以在我的 PurchaseOrders 控制器中,在 permit 函数中我有:
def purchase_order_params
params.require(:purchase_order).permit(:Date, :purchase_order_number,
:description, :quantity => [], :quantities_attributes => [], :amount,
:item_ids => [], :item_attributes => [], :supplier_ids => [])
end
这是在表单中提交但仍然给出错误的参数哈希:
{"utf8"=>"✓", "authenticity_token"=>"DMZ6lROwRr11S3XLc2eXcb2In+G4weMZCJwhF0Bt8kQ=",
"purchase_order"=>{"Date(1i)"=>"2013", "Date(2i)"=>"12", "Date(3i)"=>"29",
"item_ids"=>["", "9"], "quantity"=>{"amount"=>"98"}, "supplier_ids"=>["", "4"],
"description"=>"", "amount"=>""}, "id"=>"170"}
为什么数量参数仍然不允许?为什么我提交表单时它不会将 :amount 保存在 Quantity 连接表中?还是我的设置全错了?
更新 这是完整的 PurchaseOrder 控制器代码: https://github.com/andrewcockerham/inventory/blob/master/app/controllers/purchase_orders_controller.rb
这是完整的服务器错误:(quantity => [])
Processing by PurchaseOrdersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"DMZ6lROwRr11S3XLc2eXcb2In+G4weMZCJwhF0Bt8kQ=", "purchase_order"=> {"Date(1i)"=>"2014", "Date(2i)"=>"1", "Date(3i)"=>"1", "item_ids"=>["", "9"], "quantity"=>{"amount"=>"2345"}, "supplier_ids"=>["", "5"], "description"=>"2345", "amount"=>"2345"}, "id"=>"197"}
PurchaseOrder Load (0.2ms) SELECT "purchase_orders".* FROM "purchase_orders" WHERE "purchase_orders"."id" = ? LIMIT 1 [["id", "197"]]
Unpermitted parameters: quantity
(0.1ms) begin transaction
Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = ? LIMIT 1 [["id", 9]]
Item Load (0.1ms) SELECT "items".* FROM "items" INNER JOIN "quantities" ON "items"."id" = "quantities"."item_id" WHERE "quantities"."purchase_order_id" = ? [["purchase_order_id", 197]]
SQL (0.7ms) INSERT INTO "quantities" ("created_at", "item_id", "purchase_order_id", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Wed, 01 Jan 2014 21:00:40 UTC +00:00], ["item_id", 9], ["purchase_order_id", 197], ["updated_at", Wed, 01 Jan 2014 21:00:40 UTC +00:00]]
Supplier Load (0.1ms) SELECT "suppliers".* FROM "suppliers" WHERE "suppliers"."id" = ? LIMIT 1 [["id", 5]]
Supplier Load (0.1ms) SELECT "suppliers".* FROM "suppliers" INNER JOIN "orders" ON "suppliers"."id" = "orders"."supplier_id" WHERE "orders"."purchase_order_id" = ? [["purchase_order_id", 197]]
SQL (0.3ms) INSERT INTO "orders" ("created_at", "purchase_order_id", "supplier_id", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Wed, 01 Jan 2014 21:00:40 UTC +00:00], ["purchase_order_id", 197], ["supplier_id", 5], ["updated_at", Wed, 01 Jan 2014 21:00:40 UTC +00:00]]
PurchaseOrder Exists (0.1ms) SELECT 1 AS one FROM "purchase_orders" WHERE ("purchase_orders"."purchase_order_number" = '20140101-04' AND "purchase_orders"."id" != 197) LIMIT 1
SQL (0.2ms) UPDATE "purchase_orders" SET "description" = ?, "amount" = ?, "Date" = ?, "updated_at" = ? WHERE "purchase_orders"."id" = 197 [["description", "2345"], ["amount", #<BigDecimal:7ff184e1e4c0,'0.2345E4',9(18)>], ["Date", Wed, 01 Jan 2014], ["updated_at", Wed, 01 Jan 2014 21:00:40 UTC +00:00]]
(1.1ms) commit transaction
`Redirected to http://localhost:3001/purchase_orders/197`
Completed 302 Found in 28ms (ActiveRecord: 3.6ms)
Started GET "/purchase_orders/197" for 127.0.0.1 at 2014-01-01 15:00:40 -0600
Processing by PurchaseOrdersController#show as HTML
Parameters: {"id"=>"197"}
PurchaseOrder Load (0.1ms) SELECT "purchase_orders".* FROM "purchase_orders" WHERE "purchase_orders"."id" = ? LIMIT 1 [["id", "197"]]
DEPRECATION WARNING: This dynamic method is deprecated. Please use e.g. Post.where(...).all instead. (called from show at /Users/Andrew/code/RailsCode/TVA2/TVAInventory/app/controllers/purchase_orders_controller.rb:23)
Quantity Load (0.2ms) SELECT "quantities".* FROM "quantities" WHERE "quantities"."purchase_order_id" = 197
Supplier Load (0.1ms) SELECT "suppliers".* FROM "suppliers" INNER JOIN "orders" ON "suppliers"."id" = "orders"."supplier_id" WHERE "orders"."purchase_order_id" = ? [["purchase_order_id", 197]]
Item Load (0.1ms) SELECT "items".* FROM "items" INNER JOIN "quantities" ON "items"."id" = "quantities"."item_id" WHERE "quantities"."purchase_order_id" = ? [["purchase_order_id", 197]]
Rendered purchase_orders/show.html.erb within layouts/application (3.5ms)
Rendered layouts/_header.html.erb (0.6ms)
Completed 200 OK in 16ms (Views: 12.7ms | ActiveRecord: 0.5ms)
还有quantity => [:amount]
ActiveRecord::UnknownAttributeError (unknown attribute: quantity):
app/controllers/purchase_orders_controller.rb:79:in `block in update'
app/controllers/purchase_orders_controller.rb:78:in `update'
整个代码可以在 github repo 中查看。
【问题讨论】:
-
在您的白名单中,您有
:quantity => [], :quantities_attributes => [], :amount,。:amount是Quantity以外的表中的字段吗?您是否尝试过从白名单中删除:quantity => []以查看会发生什么?其他两个模型中的列是什么?当您提交表单并遇到错误时,您能否显示整个 Web 服务器日志? -
我在想
:quantity => [:amount]或quantities_attributes => [:amount]可能是您要找的东西?也试试这些,让我知道。 -
我尝试了这两种方法,但我从
purchaseorder#update操作中得到了未知属性错误。我已经更新了帖子以包含控制器代码和完整的错误代码 -
我在两个不同的浏览器中重新加载了这个页面,并没有看到新的错误代码或控制器代码。
-
啊抱歉,我还在打字:)
标签: ruby-on-rails ruby-on-rails-4 nested-forms nested-attributes has-many-through