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を使うように書かれていたりしてちょっとハマったのでメモ。