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

Posted by jolantern on Monday, September 12, 2016

Railsにおけるユーザ認証

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

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

環境

  • rails 5.0
  • OSX

Deviseでユーザ認証がしたい

<code class="shell"># gem "devise" をGemfileに追記して
$bundle install
</code>

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

<code class="shell">$ rails g devise:install
$ rails generate devise User
</code>

とやるだけでインストールとUserモデル、Viewが出来上がる。 http://localhost:3000/users/sign_up にアクセスすればユーザのサインアップができる。

<code class="shell">$ rails g controller home index authentication
</code>

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

<code class="ruby">class HomeController < ApplicationController
  before_action :authenticate_user!, only: :authentication
  def index
  end

  def authentication
  end
end
</code>

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

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

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

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

<code class="shell">$ bundle exec rails generate migration add_name_to_users last_name:string first_name:string
</code>

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

<code class="shell">$ rails g devise:controllers users
</code>

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

<code class="ruby">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
</code>

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