2011-10-21 3 views
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 

2本の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: 

私は上記のコードでマークされた行をコメントアウトした場合、OKを動作するように表示されます。

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 

しかし、私は配達がSTIであることをリフレッシュした後に表示することができますこの後に期待しますか?

+0

はあなたが試すことができ '最初の' if'内部self.delivery_state =「RECEIVED''にしますローカル変数を作成しておらず、代わりにセッターを呼び出していることを確認してください。 –

答えて

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 

参照:Why do ruby setters need “self.” qualification within the class?

+0

ありがとうございました!それは働いて、特に何が起こっているのかを説明するリンクに感謝!私はもともとこのコードをコントローラに書いていたので、それがうまくいくはずだと分かっていましたが、私が壊したものは分かりませんでした。 – asc99c

0

save(:validate => false)をお試しいただけますか?

時々、Railsは黙ってバリデーションに失敗し、保存しないという厄介な癖があります。

おそらく、どんなあなたの状態を保存しないように... :)

+0

彼は彼のコードにバグを持っています - それはかなり明白です - なぜdownvvoteですか? – Tilo

+0

私は訂正されました – Tilo

+0

私は同意する、あなたの答えは正しい - 私は常に明示的に自分自身を書くので、私は決してその1つに遭遇したとは思わない。 – Tilo

関連する問題