2015-01-21 6 views
1

Моя модель «Пользователь» имеет атрибут даты :birthday. Но если я отправлю день рождения в любом формате, отличном от x/x/x, он просто станет нулем. Так, например, 1/1/1 становится «0001-01-01», но 1/1/15 становится ноль. 1/1/2 будет "0001-01-02", но 22/1/3 будет nil.Каков правильный формат для типа даты?

Я чувствую, что здесь что-то отсутствует. Не может быть правдой, что атрибуты даты могут быть только x/x/x, правильно?

+0

Обычно вы должны представить 'Date' или' Time' (или 'DateTime'), а не' String'. – mhutter

+0

@Manuel Итак, как работает «1/1/1», когда «1/1/15» нет? –

+0

У меня нет идеи. Возможно, это связано с используемой вами БД. Вот почему вы должны представить дату; см. ответ Макса Уильяма ниже. – mhutter

ответ

1

Как вы устанавливаете дату? Это что-то вроде @user.birthday = params[:birthday]? Это вызовет проблемы, потому что это не дата, это строка и строка в другом формате, как ваша база данных хранит дату.

У вас есть два варианта:

A) В идеале вы должны преобразовать входной сигнал на дату, а затем в поле с использованием фактической сдачи объекта.

B) убедитесь, что формат вашего параметра совпадает с тем, как ваши db хранят даты (что выглядит «yyyy-mm-dd» по внешнему виду).

A является предпочтительным. Я бы переопределил метод User # birthday =, чтобы попытаться обработать дату как можно более полезную. например

#in User model 
def birthday=(arg) 
    if arg.is_a?(Date) 
    self[:birthday] = arg 
    elsif arg =~ /\d+\/\d+\/\d+/ 
    self[:birthday] = Date.strptime(arg, "%d/%m/%y") 
    elsif arg =~ /\d+\-\d+\-\d+/ 
    self[:birthday] = Date.strptime(arg, "%y/%m/%d") 
    else 
    self[:birthday] = arg 
    end 
end 
+0

На этом этапе я просто пытаюсь установить его с помощью консоли rails, так вот так: '$ User.create (день рождения:« 1/1/15 »)'. Почему «1/1/1» работает, в таком случае? –

+0

Rails попробует лучше всего преобразовать его в дату, но, скорее всего, это будет неправильно. Возможно, он ожидает, что последний номер будет месяцем, а 15 - недействительным месяцем. В любом случае, это не имеет большого значения - вам нужно убедиться, что он всегда будет работать, либо предоставив ему строку в ожидаемом формате, либо предоставив ей фактический объект Date. –

Смежные вопросы