[RUBY] Implementierungsrichtlinie zum dynamischen Speichern und Anzeigen der Zeitzone in Rails

Hintergrund und Anforderungen

Es wurde darum gebeten, die Zeit für Ereignisse wie Besprechungen unter Berücksichtigung aller Zeitzonen zu speichern.

Zum Beispiel Meeting1 findet ab 11:00 Uhr in Tokio statt. Meeting2 findet ab 10:00 Uhr UTC statt.

Ich möchte so etwas ausdrücken.

Montagevorgang

--Fixieren Sie die Standardzeitzone des Rails-API-Servers.

Pin die Standardzeitzone des Rails API-Servers.

Zunächst muss Rails mehrere Zeitzonen berücksichtigen.

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

Dieses Mal habe ich alle Zeitzonen unten auf UTC gesetzt, um Verwirrung zu vermeiden.

Zeitzone in DB speichern

Speichern Sie die Referenzvariable, die die Zeitzone ändert. Da die Zeitzone über ActiveSupport geändert wird, können Sie die folgende Validierung schreiben, damit der gültige Wert gespeichert wird.

# tz :string
class Meeting < ApplicationRecord 

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

end

Entscheiden Sie, wo die Logik eingefügt werden soll, die die Zeitzone beim GET mit der API in dynamisch ändert.

Wenn die API einen Wert zurückgibt, fügen wir eine Logik ein, die die Zeitzone dynamisch ändert und die Zeit zurückgibt. In diesem Fall habe ich es in Serialzer integriert. Da diese Logik mit der Anzeige zusammenhängt, haben wir beschlossen, sie in eine Ebene in der Nähe von Ansicht zu legen.


#  tz :string
class Meeting < ApplicationRecord 
  ~~

  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

# actieve_

[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


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

Überprüfen Sie unter Berücksichtigung der Zeitzone, ob der Zeittyp in der Datenbank gespeichert ist. Das Speichern erfolgt mit Zeitzoneninformationen. Wenn Sie eine Zeichenfolge übergeben, wird ActiveRecord dies gut tun. Beim Speichern der aufgezeichneten Zeitzone in UTC wird ein Verhaltensmodul des Controllers wie das folgende erstellt, sodass eine Zeichenfolge ohne Zeitzoneninformationen nicht übergeben wird und die Validierung von before_action abgebissen wird. Zusammenfassung

Rails hatte ein Bild, das im Zeitsystem viele Punkte zu beachten hat. Mit dieser Implementierung habe ich vollständig verstanden ()

Bitte folgen Sie uns auch auf Twitter. !!

https://twitter.com/yoshixj

Recommended Posts

Implementierungsrichtlinie zum dynamischen Speichern und Anzeigen der Zeitzone in Rails
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
Ändern Sie Datum und Uhrzeit in Rails in japanische Notation
Kalenderimplementierung und bedingte Verzweigung im einfachen Kalender von Rails Gem
[Schienen] So zeigen Sie Bilder in der Ansicht an
Speichern und zeigen Sie mehrere Bilder an
[Rails] So definieren Sie Makros in Rspec und standardisieren die Verarbeitung
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
So wechseln Sie in Netty dynamisch zwischen FIN und RST
[Schienen] Anzeigen von Informationen, die in der Datenbank gespeichert sind
[Webpacker] Zusammenfassung der Installation von Bootstrap und jQuery in Rails 6.0
[Rails] So zeigen Sie übergeordnete Informationen in der untergeordneten Ansicht in verschachtelten Beziehungen an
So löschen Sie große Datenmengen in Rails und Bedenken
Dinge, an die Sie sich erinnern sollten, und Konzepte im Ruby on Rails-Tutorial
[rails6.0.0] Speichern von Bildern mit Active Storage im Assistentenformat
[Schienen] Startzeit und Endzeit speichern
[Rails] Anzeigen von Datenbankinformationen
Aktivieren Sie jQuery und Bootstrap in Rails 6 (Rails 6).
[Rails] Implementierung des Anmeldebildschirms in Devise
Entfernen Sie "Assets" und "Turbolinks" in "Rails6".
CRUD-Funktion und MVC in Rails
So installieren Sie jQuery in Rails 6
So installieren Sie Swiper in Rails
[Rails] Implementierungsverfahren der Funktion zum Markieren von Posts ohne Gem + die Funktion zum Eingrenzen und Anzeigen von Posts nach Tags
# 8 Seed-Implementierung zum Erstellen einer Bulletin Board-API mit Zertifizierungsautorisierung in Rails 6
Versuch und Irrtum, um nationale Feiertage in der Android-App-Entwicklung anzuzeigen. Teil 2
Versuch und Irrtum, um nationale Feiertage in der Android-App-Entwicklung anzuzeigen. Teil 1
Ändern Sie das Speicherziel des Bildes in der Rails-App in S3. Teil 2
Einbetten und Anzeigen von YouTube-Videos in Rails (Sie können die eingegebene URL auch durch Bearbeiten abrufen).
So implementieren Sie Suchfunktionen in Rails
So ändern Sie den App-Namen in Rails
Installieren Sie Webpacker und Yarn, um Rails auszuführen
So fügen Sie ein Video in Rails ein
Java-Implementierung zum Erstellen und Lösen von Labyrinthen
[Rails] So zeigen Sie Fehlermeldungen einzeln an
Verwendung von MySQL im Rails-Tutorial
[Rails] [Hinweis] Wann = zu <%%> hinzugefügt werden soll und wann nicht
[Rails] So konfigurieren Sie das Routing in Ressourcen
So implementieren Sie Ranking-Funktionen in Rails
[Schienen] Sternebewertung implementieren (Eingabe, Speichern, Anzeigen)
[Rails] Verwendung von video_tag zum Anzeigen von Videos
Verwendung von credentials.yml.enc aus Rails 5.2
Von Java nach C und von C nach Java in Android Studio
So zeigen Sie Fehlermeldungen auf Japanisch an
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 6. Zeigen Sie, erstellen Sie die Implementierung
Ein Memo zum Erstellen eines einfachen Formulars, das nur HTML und CSS in Rails 6 verwendet
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung im Rails 6 # 7-Update und zerstören Sie die Implementierung