[RUBY] [Rails] Validez l'heure de début (type datetime) et l'heure de fin

Détails d'implémentation

Définissez l'heure de début et l'heure de fin sur le tableau d'affichage et créez un site pour recruter des personnes. Définissez la validation de sorte que l'heure de fin ne précède pas l'heure de début. (* De plus, ajoutez la validation que l'heure de début ne précède pas la date et l'heure actuelles)

environnement

Ruby 2.5.0 Rails 6.0.3.4

supposition

Lors de la création d'un tableau de recrutement, définissez-le de sorte que vous puissiez saisir l'heure de début et l'heure de fin.

Code réel

Cette fois, la version recrutement s'appelle board. Le contenu du tableau est comme ↓

XXXX_create_boards.rb


class CreateBoards < ActiveRecord::Migration[6.0]
  def change
    create_table :boards do |t|
(Omis)
      t.datetime :start_time, null: false
      t.datetime :finish_time, null: false
      
      t.timestamps
    end
  end
end

Définissez l'heure de début dans la colonne "start_time" et l'heure de fin dans la colonne "finish_time".

modèle

J'ai défini les validations suivantes.

models/board.rb


  validates :start_time, presence: true
  validates :finish_time, presence: true
  validate :start_finish_check
  validate :start_check

  def start_finish_check
    errors.add(:finish_time, "Veuillez sélectionner une heure postérieure à l'heure de début") if self.start_time > self.finish_time
  end

  def start_check
    errors.add(:start_time, "Veuillez sélectionner une heure postérieure à la date et à l'heure actuelles") if self.start_time < Time.now
  end

Je vais expliquer brièvement chacun d'eux.

models/board.rb


  validate :start_finish_check
  validate :start_check

Ici, nous vérifions chaque processus. Notez que c'est «valider» au lieu de «valider». Si c'est validate, vous obtiendrez l'erreur" Vous devez fournir au moins une validation ".

  def start_finish_check
    errors.add(:finish_time, "Veuillez sélectionner une heure postérieure à l'heure de début") if self.start_time > self.finish_time
 #↑ pour comparer l'heure de début et l'heure de fin
  end

  def start_check
    errors.add(:start_time, "Veuillez sélectionner une heure postérieure à la date et à l'heure actuelles") if self.start_time < Time.now
 #↑ pour comparer l'heure de début et la date et l'heure actuelles
  end

Ici, nous comparons à chaque fois. Si ʻif` est vrai, une déclaration d'erreur sera ajoutée. Il n'est pas nécessaire de l'écrire, mais il est également possible d'écrire la direction du nombre d'inégalité «>» et de réécrire «si» comme «à moins». De plus, le même processus est effectué sans écrire «self». Ce domaine est votre choix.

Obtenir du temps

Cette fois, il s'agissait d'une comparaison de type Datetime, mais je pense qu'elle peut être implémentée de la même manière pour d'autres types. ↓ est un article de référence pour obtenir la date et l'heure Obtenez la date et l'heure actuelles avec ruby [Différences entre l'heure, la date, la date et l'heure, TimeWithZone entre Ruby et Rails] (https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)

Article de référence

Comment valider le type datetime avant et après l'entrée avec des rails [Validation] rails Comment spécifier après la date d'aujourd'hui

Recommended Posts

[Rails] Validez l'heure de début (type datetime) et l'heure de fin
[Rails] Enregistrer l'heure de début et l'heure de fin
[Rails] Précautions lors de la comparaison de la date et de l'heure avec DateTime
Quelle classe doit être utilisée pour obtenir la date et l'heure dans l'application Rails (Time, DateTime, TimeWithZone)
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
[Rails / ActiveRecord] Je souhaite valider la valeur avant la conversion du type (_before_type_cast)
Mettre en forme la date et l'heure données par created_at
[Rails / Active Record] À propos de la différence entre créer et créer!
Un mémo sur le flux de Rails et Vue
Unifier le fuseau horaire de l'application Rails à l'heure japonaise
Méthode de construction de l'environnement et dépanneur au moment du développement conjoint (rails, docker et github)