Controllerからvalidationエラーに登録
railsでvalidationを考えていて正規表現にマッチしたらエラーという風にしたかったのですが、
Modelでの正規表現によるvalidationではマッチしなかったらエラーという風にしか出来ません;
#出来るのかもしれませんが調べてみても自分には分かりませんでした
何とか不正な文字列をグループ化してそれにマッチしたらエラーにしようと試行錯誤したのですが、
どうやら正規表現では文字(aとかb,c)の否定は出来るのですが、文字列(test,hogeなど)の否定は出来ないようなのです
そのためvalidationにおいてある単語とマッチしたらエラーということが出来ません
仕方ないのでController側で
if user_input =~ /(hoge|test|huga…)/i
で検索ヒットしたらエラーにするという方式にしました
具体的には、
valid = @user.save
if @user[:field] =~ /^(hoge|test|huga…)$/i
@user.errors.add(:field, ‘is invalid word’)
valid = false
end
# validがfalseならエラー出力
return false unless valid
という形にしました
まずは普通にModelのバリデーションを通します(ここで通過できていなければvalidにはfalseが入る)
次に使わせたくない単語を正規表現でどんどん文字グループに入れて行きます
#正規表現の話ですが、sessionとsessions、statusとstatusesなどは(sessions?|status(es)?|…)という感じにすると楽
#最後のiは大文字・小文字を区別させないという意味(session,Session,SESSIONなどは全て同一と見なす)
ここで正規表現にマッチしたらvalidをfalseにして追加したエラーが出力されるようにします
#これよりもいい方法ってあるのかなぁ…あるんだろうなー;