Nwht0xn1

ActiveModelで特定の語句を含むことを禁止するValidationを定義するCreated on 2016-07-05 by r7kamura

例えば https://amakan.net/ では、書籍の重複を防ぐために「蒼き鋼のアルペジオ コミック 1-7巻セット」や「君のナイフ コミック 全10巻完結セット」のような書籍が登録されることを禁止している。これは「巻セット」や「巻完結セット」のような禁止ワードを幾つか用意することで対応しているが、これをActiveModelの既存のValidatorで実現するためには、以下のようにFormatValidatorが利用できる。

class Book < ActiveRecord::Base
  INVALID_NAME_PARTS = %w(
    Amazon.co.jp限定
    コミックセット
    ドラマCD
    同梱版
    巻セット
    巻完結セット
    特装版
    限定版
  )

  validates :name, format: { without: ::Regexp.union(INVALID_NAME_PARTS) }
end

String#include? を利用できるようなものがあれば理想的だったが、存在しないようなので (知っていれば教えてください)、代わりに正規表現を渡せるFormatValidatorを利用した。

Pi87e1fe
Commented on 2016-07-05

あ、すいません、部分利用も禁止のやつだったですね、すいません!

Nwht0xn1
Commented on 2016-07-05

自分も最初ExclusionValodatorを考えて諦めた口です。ただ、もしExclusionValidatorの各要素との一致判定のロジックが === て実装されていれば、正規表現の配列を渡して実現できますね

Nwht0xn1
Commented on 2016-07-05

ExclusionValidatorの方が妥当なエラーメッセージを提供できそうなので、これで実装できるならこちらを使う方がいいかも