2011-07-27 48 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为零。

那么我该如何避免这种情况呢?我试图克隆和DUP的方法,但我不知道我想有一个新的复制用户对象...

奇怪的事情太多,如果我尝试这个在轨控制台:

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

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

所以我认为我错过了一些东西...

+0

对于所有者的访问器方法是什么样的 - 在那里发生了什么非标准?或者用户对象中的@ ='方法?试试'@所有者'而不是'self.owner'?试试'self.owner,self.previous_owner = self.previous_owner,nil'? – Andy

回答

2

请注意,self.ownerself.previous_owner是由Rails提供的便捷方法。实际字段应该被称为owner_idprevious_owner_id,并包含您要链接到的User的实际ID。

那么简单的,和故障安全的方法是编写

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

self.save!如果保存失败将提高。

+0

Thx它的工作原理!但是,您是否知道在调用拒绝后如何停止执行myObject.reload?或者这是正常的吗? –

+0

备注:在ruby中我们不是骆驼大小写变量。它被认为是丑陋的:)如果你需要在拒绝之后访问'owner',并且之前访问过'owner',那么你需要确实重新加载''。 – nathanvda