2011-07-27 3 views
0

어떤 사람이 도울 수 있다면 매우 괴로운 문제가 있습니다.Ruby 객체의 속성을 복사 할 수 없습니다.

내가 속성을 가진 클래스 작업을하고 난 (나는 수화기를 변경거야 때문에) 쾅 방법을 만들고 싶어하지만 난 개체를 변경할 수 아니에요 제대로 속성 :

def reject! 
    return nil if self.previous_owner.nil? 
    self.delegate = false 

    # Before, owner equal a User object 
    self.owner = self.previous_owner # previous_owner is also a User object, but different 
    self.previous_owner = nil 

    return self if self.save 
    raise "Can't save object" 
end 

이 원 ' self.owner가 무효가되기 때문에 작업하지 않습니다 ... Ruby에 self.owner = self.previous_owner를 말한 다음 self.previous_owner를 nil로 변경하기 때문에 이것이 발생합니다.

그래서 어떻게 피할 수 있습니까? 나는 복제 및 DUP 방법을 시도했지만 내가 레일 콘솔에서이하려고하면 나는

이상한 일이 너무 ... 나는 새로운 복사 사용자 개체를 갖고 싶어 확실하지 않다 :

a = 'Foo' 
b = a 
a = 'New value' 

puts a # "New value" 
puts b # "Foo" 

그래서 내가 뭔가를 놓친 것 같아.

+0

소유자의 접근 자 메소드는 어떻게 생겼습니까? 비표준적인 일이 있습니까? 아니면 사용자 객체의'@ ='메소드인가? 'self.owner' 대신'@ owner'를 시도해보십시오. 'self.owner, self.previous_owner = self.previous_owner, nil'을 시도해보십시오. – Andy

답변

2

self.ownerself.previous_owner은 레일즈가 제공하는 편리한 방법이다. 실제 입력란은 owner_idprevious_owner_id과 같아야하며 연결하려는 실제 ID는 User입니다.

그래서 간단하고, 안전 장치 방법은 저장이 실패하면 올릴 것이다

self.owner_id = self.previous_owner_id 
self.previous_owner = nil # this will unlink the previous owner 
self.save! 

self.save!을 작성하는 것입니다.

+0

그것은 작동합니다! 그러나 거부를 호출 한 후 myObject.reload를 중단하는 방법을 알고 있습니까? 아니면 그렇게하는 것이 정상입니까? –

+0

비고 : 루비에서 우리는 낙타 사례 변수를 사용하지 않습니다. 그것은 추한 것으로 간주됩니다 :) 거부 후'owner'에 액세스해야하고 이전에'owner'에 액세스 한 경우'reload'를 실제로 수행해야합니다. – nathanvda

관련 문제