14
14

More than 3 years have passed since last update.

【Rails】deviseのバリデーションをカスタマイズ

Posted at

最初に

deviseを使用して、ユーザーの新規登録機能を実装している際に、
バリデーションを付与しているのにバリデーションが適用されず、実装に苦戦したため備忘録として残します。

deviseのデフォルトのバリデーション

deviseは認証機能を簡単に実装できる様にするためのgemですが、勝手にgemが動いてくれるがゆえに見えないところで何をしているかが、初学者の私には理解が難しかったです。これがバリデーションを付与しているのに適応されない原因でした。

new.html.haml

= 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に修正。

new.html.haml
= form_for(@user, url: user_user_registration_path) do |f|  
  = f.text_field :password
end

これでpasswordカラムと認識。

2.deviseのバリデーションの設定

ただモデルのpasswordカラムを追加に対してバリデーションをかけると2重でバリデーションがかかってしまうので、
deviseのバリデーションを追加している:validatableを削除する。

user.rb
class User < ApplicationRecord
 devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :validatable 
                                  #↑削除する。
end

これでdeviseのバリデーションは掛からなくなり、passwordに自分でカスタマイズしたバリデーションが付与されるようになりました。

まとめ

・バリデーションには参照する優先順位があり、
テキストフィールドに与えられているバリデーション>devise>自作のバリデーション
となっている。
・カスタムバリデーションのみ適用させる場合は、text_fieldを使い、deviseの:validatableを削除する。

参考文献

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14