[rails] deviseのデフォルトについて


deviseの導入とデフォルトについて

  • deviseの導入
  • deviseのデフォルト

Why

deviseに関する記事を調べた時にdeviseのコントローラーを作る記事しかなく、application.controllerのみで完結させたかったから。また、その際にdeviseがデフォルトで持つ範囲を知らなく、余計なカラムやvalidationを記述していた為エラーの解決に時間がかかったのでこれを参考にしていただければと思います。

devise導入

Gemfile(最後の行)
gem 'devise'
ターミナル
# 現在のディレクトリが~/projects/pictweetであることを確認
% pwd

# Gemをインストール
% bundle install
ターミナル
# サーバーを起動
% rails s
ターミナル
# deviseの設定ファイルを作成
% rails g devise:install
ターミナル
# deviseコマンドでUserモデルを作成
% rails g devise user

以下のようにdevise_for :usersが入っていればOK!

routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: 'tweets#index'
  resources :tweets
end

次はテーブルの作成

ターミナル
# マイグレーションを実行
% rails db:migrate

データベースにテーブルが作成されていればOK!

最後に下記も忘れずに!

ターミナル
# ctrl + Cでローカルサーバーを終了

# 再度ローカルサーバーを起動
% rails s

これで一通りdeviseの導入が終わったので、あとは好きなように実装するだけです。

今回はデフォルトについてです!!!

こちらはあまり関係ないのですが、validatesでname,email,passwordしかかけておらずデータベースを確認するとpasswordの部分がencrypted_passwordでカラムとして登録してあります。「validatesにencrypted_passwordがないよ?」と突っ込みたいところですがencrypted_passwordはパスワードを暗号化してテーブルに保存するというものなのでvalidatesはpasswordをかけるだけでok。ちなみにpassword_confirmationとかもvalidatesをかけなくてok。

話が脱線してしまいましたがこちら

13行目に注目。

deviseをインストールすることでdevise_parameter_sanitizerメソッドが使えるようになります。deviseでユーザー登録をする場合に使用でき、「特定のカラムを許容する」メソッドになります。このメソッドにdevise_parameter_sanitizerメソッドを定義します。

devise_parameter_sanitizerメソッド

permitメソッドを組み合わせることにより、deviseに定義されているストロングパラメーターに対し、自分で新しく追加したカラムも指定して含めることができます。なのでノーマルな新規登録、ログイン機能くらいであればわざわざdeviseのコントローラーを作らなくてもapplication.contoroller内で完結できちゃいます。(新規登録などで複数ページに渡って遷移させる場合ちゃんとcontrollerを作った方がいい)

application.controller.rb
private
def configure_permitted_parameters  # メソッド名は慣習
  # deviseのUserモデルにパラメーターを許可
  devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
end

14行目に注目!

application.controller.rb
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])

keys:の後に続く[ ]内に:nameの他に本来:email:passwordなどを入れなければいけません。ですがdeviseのデフォルトで裏で勝手に処理してくれているのでここは:nameだけでok!

余談

バリデーションのデフォルト解除方法

これを

application.controller.rb
devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

こうするだけ!

application.controller.rb
devise :database_authenticatable, :registerable,
         :recoverable, :rememberable

まとめ

deviseは簡単に導入できて、簡単に新規登録やログイン、ログアウト機能を実装できる素晴らしいgemですが、それだけ便利すぎる裏では様々なデフォルトが勝手に反映されてしまって余計なエラーなどが起きやすくなるのでせめてもの簡単なデフォルトの紹介をさせて頂きました。