[RUBY] Politique de mise en œuvre pour enregistrer et afficher dynamiquement le fuseau horaire dans les rails

Contexte et exigences

Il y avait une demande pour enregistrer l'heure d'événements tels que les réunions en tenant compte de tous les fuseaux horaires.

Par exemple Meeting1 aura lieu à Tokyo à partir de 11h00. Meeting2 aura lieu à partir de 10h00 UTC.

Je veux exprimer quelque chose comme.

Procédure de montage

--Fixez le fuseau horaire par défaut du serveur API Rails. --Enregistrer le fuseau horaire dans la base de données

Épinglez le fuseau horaire par défaut du serveur d'API Rails.

Tout d'abord, Rails a plusieurs fuseaux horaires à prendre en compte.

https://qiita.com/joker1007/items/2c277cca5bd50e4cce5e

Cette fois, pour éviter toute confusion, j'ai défini tous les fuseaux horaires ci-dessous sur UTC.

Enregistrer le fuseau horaire dans la base de données

Enregistrez la variable de référence qui modifie le fuseau horaire. Le fuseau horaire étant modifié via ActiveSupport, vous pouvez écrire la validation suivante afin que la valeur valide soit enregistrée.

# tz :string
class Meeting < ApplicationRecord 

validates :tz, inclusion: { in: ActiveSupport::TimeZone::MAPPING.values }, presence: true

end

Décidez où insérer la logique qui change le fuseau horaire en dynamique lorsque GET avec l'API.

Lorsque l'API renvoie une valeur, nous mettons dans une logique qui modifie dynamiquement le fuseau horaire et renvoie l'heure. Dans ce cas, je l'ai incorporé dans Serialzer. Comme cette logique est liée à l'affichage, nous avons donc décidé de la placer dans un calque proche de View.


#  tz :string
class Meeting < ApplicationRecord 
  ~réduction~

  def timezone
    ActiveSupport::TimeZone.new(tz)
  end

  def use_timezone
    Time.use_zone(timezone) do
      yield
    end
  end
end

class MeetingSerializer

  attribute :start_time do |record|
    record.use_timezone do
      record.start_time
    end
  end

end

Vérifiez si le type d'heure est enregistré dans la base de données en tenant compte du fuseau horaire

Enregistrer est avec les informations de fuseau horaire, si vous passez une chaîne, ActiveRecord le fera bien.

# actieve_le fuseau horaire de l'enregistrement est UTC

[47] pry(main)> meeting
=> #<Meeting:0x00007ff2c7ad4618
 id: "162b1ed7-5502-42f8-8bed-592d2dae7db1",
 start_at: Mon, 05 Oct 2020 16:00:00 UTC +00:00,
 created_at: Tue, 06 Oct 2020 06:28:39 UTC +00:00,
 updated_at: Thu, 08 Oct 2020 02:11:54 UTC +00:00>
[48] pry(main)> meeting.start_at="2020-10-06T01:00:00+0900"
=> "2020-10-06T01:00:00+0900"
[49] pry(main)> meeting.start_at
=> Mon, 05 Oct 2020 16:00:00 UTC +00:00

Validation pour que les chaînes sans informations de fuseau horaire ne soient pas transmises lors de l'enregistrement

J'ai créé un module de préoccupation de contrôleur comme celui ci-dessous et j'ai effectué une validation avec before_action.


module ValidateTimeFormat
  class TimeFormatError < StandardError
  end

  extend ActiveSupport::Concern

  included do
    rescue_from ValidateTimeFormat::TimeFormatError, with: :render_time_format_error
  end

  TIME_FORMAT = '%FT%T%z'

  def render_time_format_error(msg)
    render json: { message: msg }, status: :bad_request
  end

  def validate_time_format(time_str)
    DateTime.strptime(time_str, TIME_FORMAT).zone
  rescue Date::Error
    raise ValidateTimeFormat::TimeFormatError, :time_format_is_invalid
  end
end

Résumé

Rails avait une image qu'il y a de nombreux points à considérer dans le système de temps. Avec cette implémentation, j'ai bien compris ()

Veuillez nous suivre également sur Twitter. !!

https://twitter.com/yoshixj

Recommended Posts

Politique de mise en œuvre pour enregistrer et afficher dynamiquement le fuseau horaire dans les rails
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
Changer la date et l'heure en notation japonaise dans Rails
Implémentation de calendrier simple de Rails Gem et branchement conditionnel
[Rails] Comment afficher les images dans la vue
Enregistrer et afficher plusieurs images
[Rails] Comment définir des macros dans Rspec et standardiser le traitement
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Comment basculer dynamiquement entre FIN et RST dans Netty
[Rails] Comment afficher les informations stockées dans la base de données dans la vue
[Webpacker] Résumé de l'installation de Bootstrap et jQuery dans Rails 6.0
[rails] Comment afficher les informations parent dans la vue enfant dans des relations imbriquées
Comment supprimer de grandes quantités de données dans Rails et problèmes
Points à retenir et concepts dans le didacticiel Ruby on Rails
[rails6.0.0] Comment enregistrer des images en utilisant Active Storage au format assistant
[Rails] Enregistrer l'heure de début et l'heure de fin
[rails] Comment afficher les informations de base de données
Activer jQuery et Bootstrap dans Rails 6 (Rails 6)
[rails] Implémentation de l'écran de connexion dans la devise
Supprimez les "actifs" et les "turbolinks" dans "Rails6".
Fonction CRUD et MVC dans Rails
Comment installer jQuery dans Rails 6
Comment installer Swiper in Rails
[Rails] Procédure d'implémentation de la fonction pour taguer les posts sans gem + la fonction pour affiner et afficher les posts par tags
Implémentation n ° 8 pour créer une API de tableau d'affichage avec autorisation de certification dans Rails 6
Essai et erreur pour afficher les jours fériés dans le développement d'applications Android. Partie 2
Essai et erreur pour afficher les jours fériés dans le développement d'applications Android. Partie 1
Modifiez la destination d'enregistrement de l'image en S3 dans l'application Rails. Partie 2
Comment intégrer et afficher des vidéos youtube dans Rails (vous pouvez également obtenir l'URL saisie en modifiant)
Comment implémenter la fonctionnalité de recherche dans Rails
Comment changer le nom de l'application dans les rails
Installez Webpacker et Yarn pour exécuter Rails
Comment insérer une vidéo dans Rails
Implémentation Java pour créer et résoudre des labyrinthes
[Rails] Comment afficher les messages d'erreur individuellement
Comment utiliser MySQL dans le didacticiel Rails
[Rails] [Note] Quand ajouter = à <%%> et quand pas
[rails] Comment configurer le routage dans les ressources
Comment implémenter la fonctionnalité de classement dans Rails
[Rails] Implémenter le classement par étoiles (entrée, sauvegarde, affichage)
[Rails] Comment utiliser video_tag pour afficher des vidéos
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
De Java à C et de C à Java dans Android Studio
Comment afficher les messages d'erreur en japonais
Créez une API de tableau d'affichage avec certification et autorisation dans Rails 6 # 6 show, créez une implémentation
Un mémo pour créer un formulaire simple en utilisant uniquement HTML et CSS dans Rails 6
Créer une API de tableau d'affichage avec autorisation de certification dans la mise à jour Rails 6 # 7, détruire l'implémentation