##最初に
deviseを使用して、ユーザーの新規登録機能を実装している際に、
バリデーションを付与しているのにバリデーションが適用されず、実装に苦戦したため備忘録として残します。
##deviseのデフォルトのバリデーション
deviseは認証機能を簡単に実装できる様にするためのgemですが、勝手にgemが動いてくれるがゆえに見えないところで何をしているかが、初学者の私には理解が難しかったです。これがバリデーションを付与しているのに適応されない原因でした。
= form_for(@user, url: user_registration_path) do |f|
= f.password_field :password, class: "main__box__bottom__content__group2__form", placeholder: "7文字以上の半角英数字",
結論はフォームでpassword_fieldを使用していたため、Railsはこの入力フォームをpasswordと認識して、簡単なバリデーションを自動でかけるようになっているようです。
##deviseのカスタマイズ手順
###1.フォームを修正(適切なフォームに)
password_fileldからtext_fieldに修正。
= form_for(@user, url: user_user_registration_path) do |f|
= f.text_field :password
end
これでpasswordカラムと認識。
###2.deviseのバリデーションの設定
ただモデルのpasswordカラムを追加に対してバリデーションをかけると2重でバリデーションがかかってしまうので、
deviseのバリデーションを追加している:validatableを削除する。
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
#↑削除する。
end
これでdeviseのバリデーションは掛からなくなり、passwordに自分でカスタマイズしたバリデーションが付与されるようになりました。
###まとめ
・バリデーションには参照する優先順位があり、
テキストフィールドに与えられているバリデーション>devise>自作のバリデーション
となっている。
・カスタムバリデーションのみ適用させる場合は、text_fieldを使い、deviseの:validatableを削除する。
##参考文献
https://qiita.com/kouheiszk/items/215afa01eeaadbd99340