概要
sendメソッドの使い方で、勉強になったのでメモ。
画像を2枚まで添付できるフォームがあり、どれくらい閾値を超えるサイズで投稿されているか調べたかったので、ログを仕込もうとしていた。
そこで、もともと次のようなコードを書いていた。
リファクタリング前
validate :checking_image_size_over_limit
def checking_image_size_over_limit
logging_image_size(image_first, 'first') if image_first.present?
logging_image_size(image_second, 'second') if image_second.present?
end
def logging_image_size(image, number)
if image&.size >= 5 * 1024 * 1024
Rails.logger.info "[#{self.class.name}] Over 5MB of images (image_#{number})"
end
end
1枚目と2枚目どちらなのかを判別したかったので、第2引数に文字列を渡し、ログのメッセージの中で展開させていた。
しかし、先輩から「それだったら、sendを使えば引数1つでいけるよ」とレビューをもらい書き直した。
リファクタリング後
validate :checking_image_size_over_limit
def checking_image_size_over_limit
logging_image_size('image_first') if image_first.present?
logging_image_size('image_second') if image_second.present?
end
def logging_image_size(image)
if send(image)&.size >= 5 * 1024 * 1024
Rails.logger.info "[#{self.class.name}] Over 5MB of images (#{image})"
end
end
sendといえば、動的にメソッドを切り替えるために使うくらいのイメージしか持っていなかったが、このように引数で渡した文字列をまたメソッドとして発動させるという方法でも使えるのだと勉強になった。