изменить год для даты в Rails - PullRequest
5 голосов
/ 27 июля 2011

У меня есть форма, которая получает день рождения пользователя.

Я хочу взять день рождения и сохранить его в другом атрибуте, но взять текущий год.

Я делаю это при обратном звонке

Модельная доска

before_save: set_delivery_date

def set_delivery_date

self.delivery_date = self.birthday
self.delivery_date.change(:year => Time.now.year)
end

День рождения 1920-07-27

Похоже, это не меняет дату.

Кто-нибудь знает, как это сделать?

Обновление

Следующие работы я вижу новую дату в базе данных:

 self.deliver_on = self.birthday.change(:year => Time.now.year)

Однако, когда я пытаюсь выполнить тесты rspec или пытаюсь выполнить это в консоли, выдается следующее сообщение об ошибке:

ArgumentError: invalid date

кто-нибудь знает, почему это происходит?

Ответы [ 3 ]

8 голосов
/ 27 июля 2011

Метод change возвращает новый экземпляр даты с одним или несколькими измененными элементами.

Попробуйте это:

def set_delivery_date
   self.delivery_date = self.birthday
   self.delivery_date = self.delivery_date.change(:year => Time.now.year)
end
0 голосов
/ 27 июля 2011

ActiveRecord Грязный объект не знает о ваших изменениях.Есть два способа исправить это:

def set_delivery_date
  self.delivery_date = self.birthday
  self.delivery_date = self.delivery_date.change(:year => Time.now.year)

  # Shorter
  self.delivery_date = self.birthday.change(:year => Time.now.year)
end

или сообщить ActiveRecord о ваших изменениях:

def set_delivery_date
  self.delivery_date = self.birthday
  self.delivery_date_will_change!
  self.delivery_date.change(:year => Time.now.year)
end
0 голосов
/ 27 июля 2011

Ваш код кажется правильным.Поэтому я бы проверил причины, по которым ваш объект не был сохранен:

  • объект недействителен?Например, object.valid? возвращает ложь.Проверка выполняется перед сохранением.
  • Вы не сохраняете?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...