2016-04-25 5 views
0

Ich habe eine Form, die eine Datepicker hat, die ein Datum mit dem Format zeigt:Rails: Datumsformat in Formularen und Datenbank

'%m/%d/%Y' 

Das Problem ist, wenn ich das Formular abgesendet hat, dieses Format ist kein gültiges Datum , so wird es nicht auf der INSERT INTO/UPDATE an die Datenbank gesendet.

Trotzdem funktioniert es, wenn ich ein Date mit diesem Format einreichen:

'%Y-%d-%m' 

ich gesehen habe, dass ich so etwas wie dies vor dem Speichern das Objekt in die Datenbank tun können:

my_object.due_date = params[:content_date].to_date.strftime("%Y-%d-%m") 

Aber Da ich mehr als ein Datumsfeld und mehr als ein Modell mit Datumsfeldern habe, würde ich gerne vermeiden, eine strftime() überall zu tun.

Haben Sie eine bessere Lösung?

+0

Welcher Datumsauswahl? Einige können in einem Format angezeigt werden, aber in einem anderen Format an den Server gesendet werden. IMO Ihre beste Wette ist es, ISO8601 ('YYYY-MM-DD') außer an den Rändern zu verwenden. –

+0

Ich benutze den Bootstrap-Datepicker –

+0

Haben Sie in der Dokumentation nachgesehen, welche Optionen es unterstützt? –

Antwort

0

Ich verwende gem 'momentjs-rails', wegen der Datetime Picker.

Modell

#deadline is saved in the db 
#this is the getter-setter for deadline_string 
def deadline_string 
    deadline.to_datetime.iso8601 
end 

def deadline_string=(deadline_str) 
    self.deadline = deadline_str 
end 

Formen

#new form 
<div class="field form-group"> 
    <%= f.label :deadline %> 
    <%= f.text_field :deadline, class: "form-control new-task-deadline" %> 
</div> 

#edit form 
<div class="field form-group"> 
    <%= f.label :deadline %> 
    <%= f.text_field :deadline_string, class: "form-control edit-task-deadline" %> 
</div> 

js wenn

$('.new-task-submit').on('click', function (e){ 
    e.preventDefault(); 
    var localMoment = moment($('.new-task-deadline').val()); 
    $('.new-task-deadline').val(localMoment.toISOString()); 
    $('#newtask').submit(); 
}); 

$(document).on('click', '.edit-task-submit', function (e){ 
    e.preventDefault(); 
    var deadlineField = $('.edit-task-deadline'); 
    var localMoment = moment(deadlineField.val()); 
    var railsDate = localMoment.toISOString(); 
    deadlineField.val(railsDate); 
    $(".task-update-form").submit(); 
}); 

js db Speichern nette Daten auf Anfrage get zeigen

//setting time and datetimepicker when opening edit task modal 
$(document).on('shown.bs.modal', '#update-task-modal', function (e) { 
    var deadlineField = $('.edit-task-deadline'); 
    var deadlineValue = deadlineField.attr('value'); 
    var momentDeadline = moment(deadlineValue).format('MM/DD/YYYY hh:mm A'); 
    deadlineField.val(momentDeadline); 
    deadlineField.datetimepicker({ 
    sideBySide: true, 
    format: 'MM/DD/YYYY hh:mm A', 
    stepping: 15, 
    widgetPositioning: { vertical: 'bottom' } 
    }); 
});