RailsのTime::DATE_FORMATS[:default]は変更しないほうがいい

RailsのTime::DATE_FORMATS[:default]は変更しないほうがいい

SN

11/21 11:05



Time::DATE_FORMATS[:default]を変更する記事たち


日付/時間フォーマットのデフォルトを設定 - Qiita
Railsで表示する日付のフォーマットを変える - 動かざることバグの如し
Rails:日時/時刻表示方法(設定)を変更する - Hello world, I am kgmx.


Railsで Time#to_s をした場合の書式を変更する方法は「rails 時刻 フォーマット」などで調べると出てくるように、 Time::DATE_FORMATS を独自に定義する方法がよく知られています。

しかし、いくつかの記事では Time::DATE_FORMATS[:default] を変更しています。これはアプリケーションの動作に問題を引き起す可能性がとても高いです。


何が問題なのか

そもそも、アプリケーション全体で使用されるdefaultの値を変更する、という時点で影響範囲がとても広くなってしまうということはおわかりいただけると思います。そして、この設定値は、あなたが書くアプリケーションのコードだけではなく、そのアプリケーションが依存しているgemにも影響します。

具体例を出します。


sidekiq-cron v0.6.3 → v1.0.4 で発生する問題

あるアプリケーションで、 sidekiq-cron を使用しており、そのバージョンを v0.6.4 から v1.0.4 にアップデートすることを考えてみます。

sidekiq-cron は、CronJob が最後にenqueueされた時刻をRedisに保存します。 v0.6.4 でのコードは以下のようになっています。


lib/sidekiq/cron/job.rb
#enque cron job to queue
def enque! time = Time.now.utc
@last_enqueue_time = time



https://github.com/ondrejbartas/sidekiq-cron/blob/v0.6.3/lib/sidekiq/cron/job.rb#L47-L74

ここで、 Time.now.utc の結果は、このまま to_s されてRedisに保存されます。

さて、 Redisから最後に queue に入った時刻を取り出す部分の v1.0.4 でのコードが以下のようになっています。


lib/sidekiq/cron/job.rb
def parse_enqueue_time(timestamp)
DateTime.strptime(timestamp, LAST_ENQUEUE_TIME_FORMAT).to_time.utc
rescue ArgumentError
DateTime.strptime(timestamp, LAST_ENQUEUE_TIME_FORMAT_OLD).to_time.utc
end



https://github.com/ondrejbartas/sidekiq-cron/blob/v1.0.4/lib/sidekiq/cron/job.rb#L554-L558

そして、 LAST_ENQUEUE_TIME_FORMAT_OLD と LAST_ENQUEUE_TIME_FORMAT は次のようになっています。

LAST_ENQUEUE_TIME_FORMAT = '%Y-%m-%d %H:%M:%S %z'
LAST_ENQUEUE_TIME_FORMAT_OLD = '%Y-%m-%d %H:%M:%S'


https://github.com/ondrejbartas/sidekiq-cron/blob/v1.0.4/lib/sidekiq/cron/job.rb#L15-L16

この辺で勘のいい方は気づかれるかと思いますが、Redisからの last_enqueue_time をparseする際、書式が想定外だと例外が発生します。

つまり、 Time::DATE_FORMATS[:default] を独自定義していた場合、 sidekiq-cron v0.6.4 時代に実行されたCronJobは v1.0.4 にアップデートすると実行できずに例外が発生してしまいます。


ではどうすればいいのか


1. 都度 strftime する

デフォルトでの to_s の結果が望ましくない場合、以下のように都度strftimeで書式を設定してやるとよいでしょう。

Time.zone.now.to_s # => "2006-01-02 15:04:05 +0900"
Time.zone.now.strftime('%Y年%m月%d日') # => "2006年01月02日"
Time.zone.now.strftime('%Y/%m/%d %A') # => "2006/01/02 Monday"



2. Time::DATE_FORMATS に独自の書式を追加する

もしくは、Time::DATE_FORMATS[:default] 以外に独自定義した書式を登録し、それを使うようにすればよいでしょう。

Time::DATE_FORMATS[:custom] = '%Y/%m/%d %A'

Time.zone.now.to_s(:custom) # => "2006/01/02 Monday"
Time.zone.now.to_s # => "2006-01-02 15:04:05 +0900"



参考


Rails で時間・時刻表示の独自フォーマットを作成する | EasyRamble

PR:デジカフェ

Qiita - Rubyタグが付けられた新着投稿

ruby 配列の初歩

SN

12/17 17:01



配列の初歩

最近ruby入門の本を読み出したので

メモがわりに細かいことを書いていこうと思います。

今回のテーマは配列の初歩的なことを書いていきます。


配列の基本操作(追加、変更、削除)


配列...

N+1問題について

SN

12/17 16:22



N+1とは

N+1 問題とは、Tree 状の情報を DB から読み出す際、全レコードの取得に一つ+各レコード分だけ SQL を発行してしまう問題です。

N+1問題はパフォーマンスにも直結するので、解決したい問題だと思い...

Dateオブジェクトから和暦を得る

Dateオブジェクトから和暦を得る

SN

12/17 15:52



はじめに

平成最後のアドベントカレンダーという事もあり、ここでは和暦に関する事を書いてみたいと思います。

と言っても和暦全般的な話ではなく、主に Dateオブジェクトから和暦を得る jisx0301 メソッ...

繰り返し処理で書かれてたりする'&'に関する自分用メモ

SN

12/17 14:45



前置き

使っておきながら&って何?って思ってたので軽く調べて考えた。

軽〜く調べて軽〜く考えただけなので違うかも。

追い追い修正していくつもりはある。


本題


(&:method)

nums = [1,...

sinatraのバージョンあげたらIndifferentHashで逝った話

SN

12/17 14:11

この記事はLIFULL Advent Calendarその2の記事です。

空いてたのでこないだみつけたsinatra関係の小ネタ投下しときます。


概要

最近とあるプロジェクトで使ってたとっても古いsinatraのバージョンを上げた...

ArgumentError: wrong number of arguments (given A, expected B)のA,Bの引数の判断方法

SN

12/17 13:29



なぜこの記事を書いたのか

このエラーでRuby内でのルールについて少し教えてもらえたので備忘録代わりに書いてみました。

いつも利用させて貰っているサイトですが、投稿は初なのでスゴイ緊張してます・・・...

RubyでMecabを使う【インストール編】

SN

12/17 13:01



すること

1.MeCabをインストールする

2.Nattoをインストールする


mecabをインストール

MeCab公式サイト

初めにファイルをダウンロードする

-ダウンロード-Sourseの<mecab-0.996.tar.gz:ダウン...

each文を使ったテーブルを作るためのメモ。

SN

12/17 12:54



each文を使ったテーブルを作るためにメモ。

テーブルの作り方はこちらの記事

【each文、ブロック】

each文はオブジェクトの数だけ、ブロック内の処理を繰り返す。

ブロックとは引数のかたまり。

each文の...

⚠ 伊藤 淳一さんに学ぶRuby on Rails 「Arel.sqlを付けるだけじゃダメ、警告対策」ハイライト抜粋学習

SN

12/17 10:55

Arel.sqlを付けるだけじゃダメ!? Railsで"Dangerous query method …”の警告が出たときの対応方法 - Qiita


Ralsユーザーへの警告


「そうか、警告が出たらArel.sqlで囲めばいいんだな」と考えて機械的に適用し...

Googleカレンダーと連携した日報生成ツールをRubyで作る

SN

12/17 09:52

会社では、日報を 本日の業務 、 明日の予定 、 一言 といった項目のMarkDown形式で、Web上のフォームに入力する運用をしています。

作業やミーティングに関しては、社内ではGoogleカレンダーで共有・管理してい...

WhiteSpaceアセンブラ・逆アセンブラの紹介

SN

12/17 07:03



はじめに

以前、WhiteSpaceを楽に書く/読むために、アセンブラ(兼実行環境)・逆アセンブラをバラバラに作成していたのですが、今回改めてRubyで作成し直したのでご紹介します。

※というより、2018年のアド...

はじめての自作gem 「Hello, Tama!」を出力してみる

はじめての自作gem 「Hello, Tama!」を出力してみる

SN

12/17 07:00



はじめに

こんにちは!Tama.rbから @fuqdaさんの圧力を受け、はじめてのアドベントカレンダーを書くことになりました、Webエンジニア一年生のしおいです。

最近は「まだまだ弱い自分が、コミュニティに貢献で...

Rubyは滅びゆく言語なのか?

SN

12/17 01:08

さて、割とキャッチーなタイトルから始めましたが、rubyの人気が落ちています。

分かりやすい指標として、TIOBEのプログラミング言語のランキングを参照しますが

2003年にはruby on railsの普及に合わせて2008...

rbenvで特定のプロジェクトのRubyバージョン変更

SN

12/17 00:58



概要

rbenvによる特定のプロジェクトにおけるRubyのバージョンの変更方法

今回はirbで日本語入力が文字化けしたため、回避するためにバージョンアップを行った。

他のプロジェクトにおいて特定のバー...

git-pr-releaseしてくれるGitHub Actions作ったよ

git-pr-releaseしてくれるGitHub Actions作ったよ

SN

12/17 00:56

GitHub Actionsがlimited public betaになったので、さっそく使ってみました。

本当はCIを作りたかったのですが、CircleCIに慣らされすぎててなかなか難しかったので、練習がてらに「issueを作ったらgit-pr-r...

RailsでのRspecの設定やら書き方とかいろいろ

RailsでのRspecの設定やら書き方とかいろいろ

SN

12/16 23:43



初めに

Ruby on Railsのテストにはmini testではなくrspecが用いられることが多いようで実際に会社で働こうと思ったらrpsecについて知っておかなくてはいけないと思い勉強したことの備忘録。

いろいろ間違っ...

【Ruby】DB覚え書き

【Ruby】DB覚え書き

SN

12/16 23:24



DB(データベース)とは



データを保存しておく場所 のこと。



DBの構成


テーブル:表で管理しているデータ(下図全体)
カラム:縦の列(下図赤いセル)
レコード:1行ずつのデータ(下図オレンジのセル...

RailsのTransactions 初心者→中級者へのSTEP16/25

SN

12/16 23:18



RailsのTransactions


はじめに

やっぱり今日はTransactionについて書きます。キャッシュはまた今度にします。


トランザクションとは

簡単にいうと、複数のSQL文の集まりです。transactionは訳せば取引で...

Best Feature for Growth

SN

12/16 17:11

A sophisticated feature is Urogenx where there is a Get Muscle Like WWE Celebrities. If Urogenx is more significant to you than Urogenx look into that. If nothing else, I can always serve as a good...

【Rails】ajaxで用いるRJS(.js.erb)ファイルでインスタンス変数展開できるって話

SN

12/16 12:13



やりたいこと

非同期処理と言えばajaxですが、RJS(.js.erb)ファイル内でcontrollerから引き継いだインスタンス変数を展開したい。


やりかた

indexで@userを作っていると過程。

formの条件によって@user...

PR:Amazonプライムビデオ

Qiita

Qiita - 人気の投稿

Qiita - AWSタグが付けられた新着投稿

Qiita - Gitタグが付けられた新着投稿

Qiita - Linuxタグが付けられた新着投稿

Qiita - MySQLタグが付けられた新着投稿

Qiita - nginxタグが付けられた新着投稿

Qiita - Dockerタグが付けられた新着投稿

Qiita - Pythonタグが付けられた新着投稿

Qiita - Rubyタグが付けられた新着投稿

Qiita - PHPタグが付けられた新着投稿

Qiita - Javaタグが付けられた新着投稿

Qiita - JavaScriptタグが付けられた新着投稿