アトトックラボ

2011年11月09日

Ruby on Rilasの認証機能 Deviseを使ってみる

Posted by Yoichi Kurusaki

Ruby on Railsの認証機能、Deviseを使ってみる。
Deviseをインストールし、認証機能が動作するところまで試してみる。

Gamefileの設定

アプリケーションのGamefileに下記の行を追加する。

gem 'devise'

deviseをインストール

$ bundle install
Fetching source index for http://rubygems.org/
Using rake (0.9.2.2) 
Using multi_json (1.0.3) 
Using activesupport (3.1.1) 
Using builder (3.0.0) 
Using i18n (0.6.0) 
Using activemodel (3.1.1) 
Using erubis (2.7.0) 
Using rack (1.3.5) 
Using rack-cache (1.1) 
Using rack-mount (0.8.3) 
Using rack-test (0.6.1) 
Using hike (1.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.0.3) 
Using actionpack (3.1.1) 
Using mime-types (1.17.2) 
Using polyglot (0.3.3) 
Using treetop (1.4.10) 
Using mail (2.3.0) 
Using actionmailer (3.1.1) 
Using arel (2.2.1) 
Using tzinfo (0.3.31) 
Using activerecord (3.1.1) 
Using activeresource (3.1.1) 
Using ansi (1.4.0) 
Using bcrypt-ruby (3.0.1) 
Using bundler (1.0.12) 
Using coffee-script-source (1.1.2) 
Using execjs (1.2.9) 
Using coffee-script (2.2.0) 
Using rack-ssl (1.3.2) 
Using json (1.6.1) 
Using rdoc (3.11) 
Using thor (0.14.6) 
Using railties (3.1.1) 
Using coffee-rails (3.1.1) 
Installing orm_adapter (0.0.5) 
Installing warden (1.0.6) 
Installing devise (1.4.9) 
Using jquery-rails (1.0.16) 
Using rails (3.1.1) 
Using sass (3.1.10) 
Using sass-rails (3.1.4) 
Using sqlite3 (1.3.4) 
Using turn (0.8.3) 
Using uglifier (1.0.4) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

Deviseをアプリに組込む

$ rails g devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml

===============================================================================

Some setup you must do manually if you haven't yet:

  1. Setup default url options for your specific environment. Here is an
     example of development environment:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     This is a required Rails configuration. In production it must be the
     actual host of your application

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       

<%= notice %>

<%= alert %>

4. If you are deploying Rails 3.1 on Heroku, you may want to set: config.assets.initialize_on_precompile = false On config/application.rb forcing your application to not access the DB or load models when precompiling your assets. ===============================================================================


インストールすると、config/initializers/devise.rbとconfig/locales/devise.en.ymlがインストールされる

Deviseのインストール時に表示される手順で手動で設定を進める。

1. 開発環境用のconfig/environments/development.rbに下記の行を追加する。
       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

※運用環境用は、production.rbに設定する。


2. config/routes.rbに下記の行を追加

  root :to => "home#index"


3. Deviseのログインメッセージを表示するために、app/views/layouts/application.html.erbに下記の行を追加する。

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>


application.html.erb

<!DOCTYPE html>
<html>
<head>
  Oct
  <%= stylesheet_link_tag    "application" %
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>
       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

<%= yield %>

</body>
</html>

Userモデルを作成

$ rails g devise User
      invoke  active_record
      create    db/migrate/20111108152249_devise_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
       route  devise_for :users

db:migrateを実行

$ rake db:migrate
==  DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
   -> 0.0417s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0010s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0007s
==  DeviseCreateUsers: migrated (0.0437s) =====================================

トップページを作成する

$ rails g controller Home index
      create  app/controllers/home_controller.rb
       route  get "home/index"
      invoke  erb
      create    app/views/home
      create    app/views/home/index.html.erb
      invoke  test_unit
      create    test/functional/home_controller_test.rb
      invoke  helper
      create    app/helpers/home_helper.rb
      invoke    test_unit
      create      test/unit/helpers/home_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/home.js.coffee
      invoke    scss
      create      app/assets/stylesheets/home.css.scss
トップ画面からログインできるようにする
<div id="user_info">
	<% if user_signed_in? %>
		<%= link_to "ログアウト", destroy_user_session_path %>
	<% else %>
		<%= link_to "ログイン", new_user_session_path %>
		<%= link_to "ユーザー登録", new_user_registration_path %>
	<% end %>
</div>

動作確認

Rails 3.1.1の環境で動かしてみると、ユーザー登録は正常に動いたが
ログアウトが正常に動作しない。

No route matches [GET] "/users/sign_out"


Rails 3.1.1では、config/initializers/devise.rbの修正が必要らしい。
下記のように修正する。

修正前
  config.sign_out_via = :delete
修正後
  config.sign_out_via = :get

これでログアウトも動作するようになった。
ログインもOK

Deviseのビューを生成

Deviseのビューを生成しておく。
カスタマイズしたい場合は、ここで出力したビューをカスタマイズする。

$ rails g devise:views
      invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/devise/mailer
      create    app/views/devise/mailer/confirmation_instructions.html.erb
      create    app/views/devise/mailer/reset_password_instructions.html.erb
      create    app/views/devise/mailer/unlock_instructions.html.erb
      create    app/views/devise/shared
      create    app/views/devise/shared/_links.erb
      invoke  form_for
      create    app/views/devise/confirmations
      create    app/views/devise/confirmations/new.html.erb
      create    app/views/devise/passwords
      create    app/views/devise/passwords/edit.html.erb
      create    app/views/devise/passwords/new.html.erb
      create    app/views/devise/registrations
      create    app/views/devise/registrations/edit.html.erb
      create    app/views/devise/registrations/new.html.erb
      create    app/views/devise/sessions
      create    app/views/devise/sessions/new.html.erb
      create    app/views/devise/unlocks
      create    app/views/devise/unlocks/new.html.erb