カスタム Validator をつくったら自動的に translate されなかったので困った。

カスタム 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 で事足りました。よかったですね。