2017-04-15 1 views
1

Dans Rails 5.1 J'ai un menu déroulant créé avec assistant de time_select d'une colonne de table de type de données « temps »:Comment interdire une option particulière d'une liste déroulante pour envoyer une valeur?

<div class="col-md-12"> 
    <%= form_for(Sleep.new) do |f| %> 
    <%= f.time_select :hours, {minute_step: 5, prompt: true, order: [:hour]} %> 
    <%= f.submit "Submit" %> 
    <% end %> 
</div> 

L'invite définit le menu déroulant à la chaîne « Heures » par défaut. En html, cette ligne n'a pas de valeur: l'option

<select id="sleep_hours_4i" name="sleep[hours(4i)]"> 
<option value="">Hour</option> 
<option value="00">00</option> 

Cependant, lorsqu'un utilisateur ne choisit rien dans le menu déroulant et le soumet à la valeur par défaut « Heures », le formulaire envoie la valeur au db:

0001-01-01 00:00:00 

Puisque la valeur des « Heures » est non nul, ma validation (ce qui devrait donner un avis utilisateur si rien a été sélectionné dans le menu déroulant) ne fonctionne pas. Comment puis-je toujours avoir "Heures" par défaut, mais définir la valeur de cette option à zéro (interdit d'envoyer des valeurs à la DB sur présentation de cette option) et être capable de donner à l'utilisateur un avis comme "Choisissez une heure!" dans ce cas?

+1

Avez-vous besoin d'avoir une invite? Sinon, vous pouvez simplement l'éteindre et ainsi vous n'avez pas ce problème. – Iceman

+0

Vous pouvez également valider avec une valeur vide, c'est une autre possibilité. Quelque chose comme 'validates: hour, presence: true, allow_blank: false' – Iceman

+0

La suppression de l'invite rend juste une heure aléatoire de la liste par défaut. – Evanto

Répondre

1

Il s'est avéré que tout ce que vous deviez avoir une invite par défaut qui envoie null à db si aucune option n'est sélectionnée et envoie une valeur à db si une option est sélectionnée est d'ajouter ignore_date: true à f.time_select attributs. Donc, je viens d'avoir

<%= f.time_select :hours, {minute_step: 5, prompt: true, order: [:hour]} %> 

à:

<%= f.time_select :hours, {minute_step: 5, prompt: true, ignore_date: true, order: [:hour]} %>