カスタム Validator をつくったら自動的に translate されなかったので困った。
ネット先生いわくこのようにエラーメッセージを追加しなさいとのことだったが、直接 errors に <<
すると ActiveModel::Errors#normalize_message を通らないのでメッセージが未消化のまま出てくる事態となる。
class StrNumValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) record.errors[attribute] << (options[:message] || 'string number error') unless number_only?(value) end #略 end
ちゃんと add
をつかうと add
メソッド内でよしなにしてくれるので rails ウェーイという感じになれる。
class StrNumValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) record.errors.add(attribute, :str_num, options) unless number_only?(value) end #略 end
add
はこんなの。
def add(attribute, message = :invalid, options = {}) message = normalize_message(attribute, message, options) if exception = options[:strict] exception = ActiveModel::StrictValidationFailed if exception == true raise exception, full_message(attribute, message) end self[attribute] << message end
ちなみにこの validator でやりたかったことは inclusion
で事足りました。よかったですね。