1

在这里发疯。任何指点都感激不尽!

我有一个交付模型,我正在尝试添加一种方法来根据交付线更新交付状态。该函数在模型类中定义,delivery_state 是模型属性之一:

def updateDeliveryState
  expectedLines = DeliveryLine.where( :delivery_id => id,
                                      :line_state => 'EXPECTED' )
  logger.debug "State1: #{delivery_state}"

  if expectedLines.length == 0
    if delivery_state == 'EXPECTED' || delivery_state == 'RECEIVING'
      delivery_state = 'RECEIVED'               # commenting this line fixes it
      save
    end
  else
    logger.debug "State2: #{delivery_state}"
    if delivery_state == 'EXPECTED'
      logger.debug "Updating to receiving"
      delivery_state = 'RECEIVING'
      save
    end
  end
end

我在日志中看到的是在两logger.debug行之间,delivery_state 已被清除:

State1: EXPECTED
DeliveryLine Load (4.5ms)  SELECT "delivery_lines".* FROM "delivery_lines" 
WHERE "delivery_lines"."line_state" = 'EXPECTED' 
AND "delivery_lines"."delivery_id" = 227
State2:

如果我注释掉上面代码中标记的行,它似乎可以正常工作:

State1: EXPECTED
DeliveryLine Load (9.6ms)  SELECT "delivery_lines".* FROM "delivery_lines" 
WHERE "delivery_lines"."line_state" = 'EXPECTED' 
AND "delivery_lines"."delivery_id" = 227
State2: EXPECTED
Updating to receiving

但是,刷新后我可以看到在此之后仍然预计交货?

4

2 回答 2

3

详细说明我的评论:您似乎在if. 看:

class Foo
  attr_accessor :bar

  def test
    unless bar
      bar = 1
    end
  end
end

f = Foo.new
f.test
puts f.bar # empty line, bar is nil

现在让我们确保我们调用了 setter:

class Foo
  attr_accessor :bar

  def test
    unless bar
      self.bar = 1
    end
  end
end

f = Foo.new
f.test
puts f.bar # prints 1

请参阅:为什么 ruby​​ setter 需要“self”。班级内的资格?

于 2011-10-21T19:08:33.613 回答
0

你可以尝试使用save(:validate => false)吗?

有时,Rails 有这种令人讨厌的习惯,即默默地验证失败并且不保存。

无论如何,您可能都想保存您的状态... :)

于 2011-10-21T19:07:09.997 回答