在我的模型中调用方法时,我想更新一个名为“started”的字段。这似乎很简单,但是:
这打破了:
has_many :terra_players, :dependent => :destroy
serialize :territory_owners
class SomeGame < ActiveRecord::Base
def startGame
self.territory_owners = []
self.terra_players.each do |i|
i.update_attributes(:my_turn => true, :army_pool => 35)
end
#give each player maxterritory number of territories
max_territories = 42 / self.terra_players.length
spare_territories = 42 % self.terra_players.length
for i in (0..42-spare_territories-1) #bleh
# pick a random player, make sure they still need territories
player = nil
while (true) do
player = self.terra_players.sample
if player.num_territories < max_territories
break
end
end
self.territory_owners.push([player, 1]) #hash instead maybe?
# make sure player gets updated too
player.num_territories += 1
player.save
end
if spare_territories != 0
j = 0
for k in (i+1..42-1)
player = self.terra_players[j]
j += 1
self.territory_owners.push([player, 1]) #hash instead maybe?
player.num_territories += 1
player.save
end
end
self.update_attribute(:started, true)
self.save
end
我明白了:
TerraPlayersController中的ArgumentError #create
错误的参数数量(2为0)
在self.update_attribute(:started, true)
行。
然而这似乎有效:
class SomeGame < ActiveRecord::Base
def startGame
...
myself = TerraGame.find(self.id)
myself.update_attribute(:started, true)
myself.save
end
为什么第二个工作但不是第一个工作?我有更好的方法吗?
答案 0 :(得分:2)
update_attribute
函数将更新保存到数据库(没有验证),因此按照您的方式调用update_attribute
AND save
没有多大意义。
但是我仍然不明白为什么你会收到这个错误。你可以尝试一下吗?
def start
self.started = true
self.save
end
答案 1 :(得分:1)
我要贴在这里,就是我已经说过的了。
22:55重新找到对象并保存它的事实似乎暗示我错误来自你在startGame方法中对对象所做的事情 22:55我自己实际上并不是Ruby中的同一个对象;它是从相同数据初始化的新实例
22:55但是它没有你在方法中做出的任何改变,因为它们没有被保存 22:55所以,我确实知道为什么会有效
所以,我们知道的很多。我想你需要透露更多的startGame方法来识别真正的问题。
答案 2 :(得分:0)
我已经弄明白了这个问题。我的序列化属性需要在保存/使用期间进行编码和解码。
正因为如此,self
的豁免正在搞砸。
正如埃里斯所说,第二种方式才有效,因为我没有将错误的更改保存到self