1

ここで怒っています。どんなポインタもありがたいことに受け取りました!

配送モデルがあり、配送ラインに基づいて配送状態を更新するメソッドを追加しようとしています。この関数はモデルクラス内で定義され、delivery_stateはモデル属性の1つです。

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

ログに表示されているのは、2logger.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

ここで、セッターを呼び出していることを確認しましょう。

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

参照:ルビーセッターに「自己」が必要な理由。クラス内の資格?

于 2011-10-21T19:08:33.613 に答える
0

使ってみsave(:validate => false)ませんか?

Railsには、検証に黙って失敗し、保存しないという厄介な習慣がある場合があります。

あなたはおそらく何があってもあなたの状態を保存したいと思うでしょう...:)

于 2011-10-21T19:07:09.997 に答える