Rails5.0でDeviseを使ったユーザ認証をした件

Posted by jolantern on Monday, September 12, 2016

Railsにおけるユーザ認証

Railsでユーザ認証をするとなるとDeviseがよく使われる、らしい。少なくとも僕はそれしか知らない。

ユーザ認証の環境がほしくて実装したのだけど、色々詰まったのでメモ。

環境

  • rails 5.0
  • OSX

Deviseでユーザ認証がしたい

# gem "devise" をGemfileに追記して
$bundle install

これで使えるようになって

$ rails g devise:install
$ rails generate devise User

とやるだけでインストールとUserモデル、Viewが出来上がる。

<div class="blogcard-snippet external-blogcard-snippet">
</div>
  <div class="blogcard-domain external-blogcard-domain">
    localhost
  </div>
</div>
$ rails g controller home index authentication

とやってあげて、home_controller.rbを変えてあげる。

class HomeController < ApplicationController
  before_action :authenticate_user!, only: :authentication
  def index
  end

  def authentication
  end
end

これで、「http://localhost:3000/home/index」は未ログインでも見ることができて、「http://localhost:3000/home/authentication」はログインしないと見れないように出来た。後者は未ログインでアクセスするとサインアップのページに飛んでくれる。

ユーザの登録情報を増やしたい

メールアドレスとパスワードだけで登録して、他の情報はあとから入れるとかも有りだと思うけど一気に入れてほしかった。

Userモデルにカラムを増やす

$ bundle exec rails generate migration add_name_to_users last_name:string first_name:string

これでカラムが増える。カラムを増やしてViewにテキストボックスをそれっぽく追加したらうまくいきそうだけどそんなことはなくて、ちゃんと設定してあげないと追加項目がDBに登録されない。

$ rails g devise:controllers users

これでdeviseのコントローラを継承したコントローラを作ってくれる。何も書かなければデフォルトの動作をしてくれるっぽい。 そんで、今回はapp/controllers/users/registrations_controler.rbを変えてあげる。

def cancel
  super
end

protected

# If you have extra params to permit, append them to the sanitizer.
def configure_sign_up_params
  devise_parameter_sanitizer.permit(:sign_up, keys: [:last_name,:first_name])
end

コメントアウトしてあげるだけで使えるようになる。 「devise_parameter_sanitizer.permit(:sign_up, keys: [:last_name,:first_name])」のところ、keysを増やすだけで複数のパラメータが登録できるようになって便利。 昔書かれた記事なんかだと、devise_parameter_sanitizer.permitじゃなくてdevise_parameter_sanitizer.forを使うように書かれていたりしてちょっとハマったのでメモ。