2017年12月22日金曜日

プロを目指す人のためのRuby入門を読みました

プロを目指す人のためのRuby入門を読みました

2014年からrubyやりはじめてもう3年の経験あるんですが、
改めて入門本読んでみるとまだまだ知らなかったり理解が浅いところとかあって、
読んでよかったなぁと思いました。

特に最近日付を入力させるフォームを使ってるところでちょっとどうしようか考えていたのがあったので、
以下の2つがタイムリーにささりました。

・正規表現のキャプチャの結果に名前をつけられる
text = '今日は2017年12月22日です'
result = /(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/.match(text)

p result[:year]
p result[:month]
p result[:day]

これで
"2017"
"12"
"22"
という風に取れる


・rescue演算子を使ってbegin/endを省略できる
require 'Date'
text = 'aaaaaa'
result = Date.parse(text) rescue nil
p result
parseできない文字列の時にはnilが返って来る。
これまでbegin/endって囲んでてうざいなと思っていたので、いいことを知りました。

2017年5月22日月曜日

rails4.1.6からrails5.0.3にアップデートでActiveSupport::TimeWithZoneにはまった

rails4.1.6からrails5.0.3にアップデートをした際にrspecのテストが落ちて、
それを解決するのに調べました。

環境
ruby2.3.1
rails4.1.6からrails5.0.3

rspecはこんな感じ
test_time = Time.now

user.test_at = test_time
user.save!

ごにょごにょ処理

test_atが変わらないよねっていうテスト
expect(user.test_at).to eq(test_time)

4.1.6では通っていたけど5.0.3で落ちたテスト結果
expected: 2017-05-16 16:26:54.647989000 +0900
          got: 2017-05-16 16:26:54.000000000 +0900

test_timeはTimeクラス、user.test_atはActiveSupport::TimeWithZone。
rails4.1.6のときはsave!のタイミングではTimeWithZoneのミリ秒はまるめられてなかったみたい。
4.1.6でもexpectの前にreloadすると、ミリ秒はまるめられたものに変わった。
rails5ではsave!のタイミングでミリ秒をまるめたものを保持するように変わったげ。