Ruby on Rails環境にてDeviseを利用する

Deviseとは

Deviseとは、RubyGemsで公開されている。最も有名な認証機能のプラグインです。

Deviseを利用するメリット

  1. ノーコーディングで、入会、退会、ログイン、ログアウト、入会時のメール認証等の機能を利用出来る。
  2. 設定が柔軟で、例えば入会時のメール認証の有無や、メールアドレスでの認証、ユーザ名での認証等、たくさんのパターンに対応可能

というような事が書いてありますので、使ってみたいと思います。

利用環境

今回のDeviseで利用したRails環境は以下のとおりです。

OS:    Windows XP (古いな…)
Ruby:  Ruby 2.0.0p247
Rails: Rails 4.0.0

セットアップと基本的な使い方

Deviseを試す為に新しいRailsアプリケーションを作成する。

$ rails new authentication_test --no-test-framework

GemFileにDeviseの記述を追加→bundle installコマンドを利用してDeviseをインストール

gem 'devise'
$ bundle install

アプリ内にコンフィグファイルを作成する為のコマンドらしい

$ rails generate devise:install

環境ファイルの設定(とりあえず開発環境のみ)

ファイル:config/environments/development.rb
最終行に以下の記述を追加
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
* localhost:3000は適宣変更する必要がある。

ここで認証ホーム画面用にScaffoldを作成する。テスト用

$ rails generate scaffold home code:string name:string

Devise用のユーザモデルを作成する

$ rails generate devise user

モデルを作成したので、db:migrateコマンドを実行する。

$ bundle exec rake db:migrate

ログイン後、サインアップ後のパスはrootパスになるので、rootパスの明示をする。先程Scaffoldで作ったhomes#indexを設定する。

ファイル:config/route.rb
以下の記述を追加
root :to => "homes#index"

レイアウトファイルに以下の記述を追加。基本RailsCastからコピーした。

ファイル:app/views/layouts/application.html.rb
<div id="container">
  <div id="user_nav">
    <% if user_signed_in? %>
     Logged in as <strong><%= current_user.email %></strong>.
      <%= link_to 'Edit profile', edit_user_registration_path %> |
     <%= link_to "Logout", destroy_user_session_path, method: :delete %>
    <% else %>
      <%= link_to "Sign up", new_user_registration_path %> |
     <%= link_to "Login", new_user_session_path %>
   <% end %>
 </div>

  <% flash.each do |name, msg| %>
    <%= content_tag :div, msg, id: "flash_#{name}" %>
  <% end %>
</div>

一回サーバを起動してみる。

$ rails s
* とりあえず動作していそうな事は確認できた。

Viewのカスタマイズをするために、Viewを作成する。

$ rails generate devise:views
* 出来たViewファイルをカスタマイズ可能
* カスタマイズは適当に対応可能

ログインをしていない場合、データを入力できないようにFilterを設定

ファイル:app/controllers/homes_controller.rb
以下の記述を追加
before_filter :authenticate_user!, except: [:index, :show]

後は、Indexの画面を出した時にNewボタンを表示しないようにする

ファイル:app/views/homes/index.html.erb
<% if user_signed_in? %>...<% end %>で囲むと、ログインしないとデータが出力されなくなる。

とりあえずこんな所です。今後サインアップ画面に名前とか住所とかの項目を追加したりする方法も今後考えていきたい。