将Rails变量传递给控制器​​方法

时间:2016-07-26 13:44:56

标签: ruby-on-rails ruby

所以,我有一个我已经工作了一段时间的程序,这只是一个基本的条形码扫描系统。

我的生产商控制器如下:

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消息,所以我知道问题与数量为零有关。但是,我不知道如何解决这个问题。

任何帮助?

3 个答案:

答案 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对象存在但quantitynil。我假设你没有默认值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.quantitynil

使用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