1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

引数で渡した文字列をsendでメソッドとして発動させる

Last updated at Posted at 2020-10-09

概要

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といえば、動的にメソッドを切り替えるために使うくらいのイメージしか持っていなかったが、このように引数で渡した文字列をまたメソッドとして発動させるという方法でも使えるのだと勉強になった。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?