2011-07-15 18 views
0

在我的模型中調用方法時,我想更新一個名爲「started」的字段。這看起來非常簡單,但是:爲什麼我不能在Rails 3.0.7中調用self.save?

這打破:

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創建

錯誤的參數數目(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

我已經找到了問題。我的序列化屬性需要在保存/使用過程中進行編碼和解碼。

因此,self的保存被搞砸了。

由於鬩說,第二種方式,只是因爲我沒有錯誤的更改保存到self

2

update_attribute函數會將更新保存到數據庫(無需驗證),因此按照您的操作方式調用update_attributesave沒什麼意義。

但是我仍然不明白你爲什麼會得到這個錯誤。你可以試試這個嗎?

def start 
    self.started = true 
    self.save 
end 
+0

哎,這東西其實我知道,但忘了。感謝您指出了這一點! – Eris

+0

感謝您的提示,但錯誤依然存在。我添加了「startGame」的完整代碼,我想知道序列化的territory_owners是否是真正的問題。 –

+0

您是否嘗試用'self.started = true'替換'update_attribute(:started,true)'?你確定你仍然得到相同的錯誤,因爲那很奇怪。 –

1

我只是要粘貼在這裏,我已經說過給你。

22:55是重新找到對象,並保存它似乎暗示,我認爲錯誤的東西從你所做的對象在startGame方法來
22:55我ISN事實在Ruby中實際上是同一個對象;它是一個新的實例,從相同的數據
22:55初始化,但它沒有任何您在該方法中所做的更改,因爲它們未保存
22:55所以,我實際上知道爲什麼那工作

所以,我們知道那麼多。我想,你需要透露更多startGame方法來確定真正的問題。

相關問題