所以,我有一个我已经工作了一段时间的程序,这只是一个基本的条形码扫描系统。
我的生产商控制器如下:
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Vary: Accept-Encoding, User-Agent
现在,我想要发生的是,当有人在表单中输入条形码时,它会将@raw创建为Raw(用于原始商品)类的实例。然后在接收功能中,它会在我的库存中搜索匹配的产品,然后将一个单元添加到我的原始商品库存中。
然而,一旦我到达class RawsController < ApplicationController
def new
@raw = Raw.new
end
def create
@raw = Raw.new(params[raw_params])
if @raw.save
receive(@raw)
redirect_to new_raw_path
end
end
def receive(raw)
scanned = Raw.find_by(code: raw.code)
if scanned.quantity.nil?
flash[:danger] = "no match"
else
scanned.quantity += 1
if scanned.save
respond_to do |format|
format.html {}
format.json{}
end
end
end
end
private
def raw_params
params.require(:raw).permit(:code, :product, :quantity)
end
end
行,我不断得到一个错误,这个方法未定义为nil类。
我添加了scanned.quantity += 1
行,我确实收到了flash消息,所以我知道问题与数量为零有关。但是,我不知道如何解决这个问题。
任何帮助?
答案 0 :(得分:1)
问题在于您在Raw.new(...)
查看您在this comment中发布的数据,我可以说该操作未创建具有正确属性的Raw
对象。要保存时,需要使用允许的属性。您使用new
致电params[raw_params]
,nil
。它应该是Raw.new(raw_params)
变化:
def create
@raw = Raw.new(raw_params)
if @raw.save
receive(@raw)
redirect_to new_raw_path
end
end
答案 1 :(得分:0)
由于scanned.quantity.nil?
的if子句成功,表示scanned
对象存在但quantity
为nil
。我假设你没有默认值0
。
理想情况下,我会在将该列添加到数据库的迁移中向0
列添加默认值quantity
。
但是,您可以在执行增量之前将其设置为0
。此外,由于您已经传递了find_by
对象,因此无需再次执行Raw
。可以对该对象本身执行操作。
def receive(raw)
scanned = raw
if scanned.nil?
# your flash message
else
scanned.quantity ||= 0
scanned.quantity += 1
if scanned.save
respond_to do |format|
format.html {}
format.json{}
end
end
end
end
答案 2 :(得分:0)
您正在尝试+=
nil
值,这就是您收到该错误的原因。
当您创建新实例@raw时,值@raw.quantity
为nil
使用after_initialize
将数量设置为0
class Raw
after_initialize :set_quantity
def set_quantity
self.quantity = 0
end
end
或强>
编写迁移以将数量默认值更改为0
def change
change_column :raw, :quantity, :integer, default: 0
end