2017-10-19 5 views
0

Nous avons créé un formulaire de réservation qui semble indiquer la date de façon incorrecte. Par exemple si vous aviez le 01/12/17, il est reconnu et enregistré au 17/12/01. Maintenant, ce n'est pas toutes les réservations juste quelques-unes. Je pensais que cela pourrait avoir à voir avec le fait qu'il est pris dans la forme comme une chaîne et transformé en une date quand il est créé.Date d'enregistrement incorrect dans la base de données uniquement de manière aléatoire

Il semble que cela arrive à des gens au hasard sur le site en direct, mais je n'ai encore rien vu sur mon localhost.

La raison pour laquelle il s'agit de:: string est pour le datepicker utilisé. Ce qui ne vous permet pas de saisir les dates que vous choisissez dans un calendrier déroulant.

Y at-il quelque chose qui me manque ici ou si quelqu'un a des idées de choses que je peux essayer? Toute aide qui serait grandement appréciée.

partie du formulaire qui traite de la date:

<%= simple_form_for [:cms, venue, booking] do |f| %> 
    ... 
    <fieldset class="form-group"> 
     <%=f.input :date, label: "Date of booking",as: :string, wrapper: :pikaday %> 
    </fieldset> 
<% end %> 

Voici la méthode create:

def create 
@booking = Booking.new(booking_params) 
    if booking_params[:reference_1] == '' || booking_params[:reference_2] == '' 
    flash[:error] = 'Must fill in both parts of booking reference' 
    return render :new 
    else 
    @booking.reference_number(booking_params) 
    end 
if @booking.save 
    flash[:notice] = 'Booking created and e-mail to organiser sent!' 
    redirect_to cms_venue_path(venue) 
else 
    flash[:error] = 'Please review the errors and try again' 
    render :new 
end 
end 

En base de données Date:

create_table "bookings", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| 
     t.date "date" 
     ... 
    end 

Je trouve aussi cette Code pikaday:

new Pikaday({ 
    field: document.getElementById('datepicker') 
    , format: 'D/M/YYYY' 
    , minDate: new Date() 
}); 
+0

Pourquoi votre champ est-il entré pour 'date' une' chaîne'? C'est évidemment la source du problème. –

+0

Votre format de date est ambiguë. Essayez de passer la date comme '2017-12-01' (ISO 8601). Votre sélecteur de date vous permet probablement de définir le format. – Stefan

+0

Je ne sais pas exactement ce qui cause le problème de coercition - il peut s'agir d'une erreur utilisateur (par exemple, entrer des dates au format mm/jj/aaaa) ou de la configuration du navigateur (si vous utilisez une datepicker) , ou peut-être quelque chose dans votre backend (est-ce que 'booking_params' analyse la date en fonction des paramètres régionaux de l'utilisateur?) .... –

Répondre

0

analyse syntaxique Date peut être issue.just créer un initialiseur dans config/initializers/date_time.rb

Date::DATE_FORMATS[:default] = "%d/%m/%Y" 
0

Les utilisateurs sont probablement dans les différents pays où ils expriment dates différentes. En Amérique, nous le faisons MM-JJ-AAAA, mais dans la plupart des pays d'Europe, ils le font JJ-MM-AAAA et je ne le sais pas directement, mais je parie qu'il y en a qui font d'autres choses.

<%= simple_form_for [:cms, venue, booking] do |f| %> 
    ... 
    <fieldset class="form-group"> 
     <%=f.input :date, label: "Date of booking (DD-MM-YYYY)",as: :string, wrapper: :pikaday %> 
    </fieldset> 
<% end %> 

La solution la plus simple serait de préciser entre parenthèses que le format que vous voulez en est (JJ-MM-AAAA) et l'autre chose que vous pourriez faire est avec en supposant que le format basé sur la localisation de l'utilisateur.

<%= simple_form_for [:cms, venue, booking] do |f| %> 
    ... 
    <fieldset class="form-group"> 
     <%=f.input :date, label: "Date of booking",as: :date, wrapper: :pikaday %> 
    </fieldset> 
<% end %> 
+0

Le mettre en tant que:: date rompt le datepicker que nous utilisons. – Georgeheap

+0

Utiliser un autre sélecteur de date, lol –

+0

* "En Amérique, nous faisons JJ-MM-AAAA, mais dans la plupart des pays d'Europe, ils le font MM-JJ-AAAA" * ... C'est l'inverse! –