2011-10-21 2 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: 

, 그것은 확인 작업 나타납니다 그러나

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''로를 로컬 변수를 작성하지 않고 대신 setter를 호출하는지 확인하십시오. –

답변

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)을 사용해 볼 수 있습니까?

때때로 레일스는 자동으로 유효성 검사에 실패하고 저장하지 않는 불쾌한 습관을 갖고 있습니다.

당신은 아마 무슨 일이 있어도 당신의 상태를 저장하지 할

... :)

+0

그는 코드에 버그가 있습니다 - 꽤 분명합니다 - 왜 downvvote입니까? – Tilo

+0

내가 맞 섰다. – Tilo

+0

나는 동의한다, 당신의 대답은 정확하다 - 나는 항상 그 사람을 만났다고 생각한다. – Tilo

관련 문제