我试图添加一个简单的库存管理系统。类产品has_many变体,变体属于产品,因此具有product_id,以及名称和数量。当用户创建产品时,我通过调用以下
产品生成11种不同的变体(只有数值)Located in variants.rb (model)
def self.create_multiple_variants( product_id )
p = Product.find(product_id)
i = 11
while i <= 21
new_variant = Variants.create
new_variant.product = p
new_variant.name = (i*2)
new_variant.qty = 0
i += 1
end
end
然后,当用户尝试显示该页面时,该程序将浏览属于该产品的每个变体,并查看它们是否为任何数量(管理员在此过程中调整),如下所示:
位于视图中:
<div class="size"><br/>Size: <%= f.select(:size, @sizes_availiable, :prompt => "Select a Size...")
位于product_controller:
@sizes_availiable = Variants.create_inventory_array( @product.id )
位于variants.rb(model)
def self.create_inventory_array( product_id )
p = Product.find(product_id)
a = []
p.variants.each do |v|
a << variant.name if variant.qty > 0
end
a
end
我知道命名它有点令人困惑,因为我把它设置为更大但现在不赞成它,所以抱歉这有点令人困惑。现在您可以将变体视为&#34; size&#34;
但它的创作部分工作正常,但是当我去展示产品时,我收到了这条消息:
ProductController中的NameError#show
app / models / variants.rb:20:in
create_inventory_array' app/controllers/product_controller.rb:18:in
show&#39;
我认为我建立关系的方式是问题的根源,无论是我或者如何调用它。有什么想法吗?
更新:
我使用了下面的建议,现在看来问题在于第二个功能。这是我的新变种.rb和我得到的错误:
class Variants < ActiveRecord::Base
attr_accessible :product_id, :name, :qty
belongs_to :product
def self.create_multiple_variants( product_id )
p = Product.find(product_id)
for i in 11..21
v = Variants.create
v.product = p
v.name = (i*2)
v.qty = 0
v.save!
end
end
def self.create_inventory_array( product_id )
p = Product.find(product_id)
a = []
p.variants.each do |variant|
a << variant.name if variant.qty > 0
end
a
end
end
NoMethodError in ProductController#create
undefined method `Variants' for #<Product:0x007fe9561ad550>
Application Trace | Framework Trace | Full Trace
app/models/variants.rb:8:in `block in create_multiple_variants'
app/models/variants.rb:7:in `each' app/models/variants.rb:7:in
`create_multiple_variants' app/controllers/product_controller.rb:33:in
`create
我仍然认为这是建立关系的一个问题(我指定的是variants.product = current_product,但我称之为product.variants - 我觉得这种关系并没有同时建立方式)
答案 0 :(得分:1)
是。你需要保存对象。
要在循环结束时保存它:
new_variant.save!
关于这个循环的旁注:
i = 11
while i <= 21
...
i += 1
end
这是一种更好的写作方式,因为它更清晰:
for i in 11..21 do
...
end
对于这样的街区:
new_variant = Variants.create
new_variant.product = p
new_variant.name = (i*2)
new_variant.qty = 0
new_variant.save!
让它更容易阅读:
v = Variants.create
v.product = p
v.name = i*2
v.qty = 0
v.save!
答案 1 :(得分:1)
问题在于此代码:
p.variants.each do |v|
a << variant.name if variant.qty > 0
end
您传入变量v
,但将其称为variant
。要修复它,请将行更改为
p.variants.each do |variant|
另请阅读:http://guides.rubyonrails.org/active_record_querying.html#conditions您可以通过查询所需product_id和qty的变体,然后调用map来获取名称,从而使代码更加优雅。
这也可以改进:
new_variant = Variants.create
new_variant.product = p
new_variant.name = (i*2)
new_variant.qty = 0
到
new_variant = p.variants.create name: "#{i*2}", qty: 0
答案 2 :(得分:0)
我弄清楚出了什么问题 - 我的模型是Variants.rb(带有s),这在某些时候引起了问题。我将文件variants.rb以及类名Variants重命名为variant.rb和Variant,重新启动了服务器,它工作正常!感谢那些帮助过的人!