Почему я не могу вызвать self.save в Rails 3.0.7? - PullRequest
0 голосов
/ 15 июля 2011

При вызове метода в моей модели я хотел бы обновить поле с именем «Запущено». Это кажется простым, но:

Это перерывы:

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

Я получаю:

ArgumentError в TerraPlayersController # 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

Почему работает второй, а не первый? Есть ли лучший способ, которым я должен делать это?

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Функция update_attribute сохраняет обновление в базе данных (без проверок), поэтому бессмысленно вызывать update_attribute AND save так, как вы делаете.

Однако я все еще не понимаю, почему вы получаете эту ошибку. Не могли бы вы попробовать это вместо этого?

def start
    self.started = true
    self.save
end
1 голос
/ 15 июля 2011

Я просто вставлю сюда то, что уже сказал вам.

22: 55 тот факт, что повторное обнаружение объекта и его сохранение, кажется, подразумевает, что ошибка приходитиз того, что вы сделали с объектом в методе startGame
22:55 я на самом деле не тот же объект в Ruby;это новый экземпляр, инициализированный из тех же данных
22:55, но в нем нет изменений, которые вы внесли в метод, потому что они не были сохранены
22:55, поэтому я действительнознаю, почему это работает

Итак, это то, что мы знаем.Думаю, вам нужно будет больше рассказать о методе startGame, чтобы определить реальную проблему.

0 голосов
/ 15 июля 2011

Я выяснил проблему. Мой сериализованный атрибут должен быть закодирован и декодирован во время сохранения / использования.

Из-за этого self сбой спасал.

Как сказала Эрида, второй способ работал только потому, что я не сохранил ошибочные изменения в self

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...