🐡
Rails|保存の前処理をbefore validationで書かない
今回のシナリオ
Userモデルがあり、nameというカラムも持っている。
モデルを保存する前に状態によってnameの値を加工したい。
一般的?な方法
自分も含めよくあるやり方がbefore_validationを用いて行う方法。
class User < ApplicationRecord
before_validation :fix_name
validates :name ~~
def fix_name
self.name = anything_method1 if standard_type?
self.name = anything_method1 if premium_type?
end
end
これだとテストを書こうと思ったときにvalid?まで行わなければならないのでちょっと違和感があった。
前後の文脈に依存しているし、なによりもvalidatinの責任ではないのでは?
セッターを定義して前処理を行う
class User < ApplicationRecord
def name=(value)
write_attribute(:name, anything_method1) if standard_type?
write_attribute(:name, anything_method2) if premium_type?
end
end
こうすることで、他のカラムの状態を気にせずにModel.newをしたときの状態でテストを書くことが出来る。
Discussion