手順はDevise開発元のGitHubに書いてある。英語だけどコマンドとかコード読めば大体できる
https://github.com/plataformatec/devise
日本語が良いかたはこっちを読むがいいさ!
http://d.hatena.ne.jp/babie/20100729/1280381392
環境
- Mac OS X 10.7.5 Lion
- ruby 1.9.3
- Rails 3.2.12
- mysql 5.1.66
やってみる。百聞は一見にしかず
GemFileに下記を追加してbundle installする。ちなみにGemFileはプロジェクトルートに配置されている。
1 |
gem 'devise' |
1 |
$ bundle install |
またしてもinstall、この辺はどうも不慣れだ。Deviseの実行準備でもしてるんだと思っておこう。実行するとこんなん出た。まだセットアップ終わってないよ!っということなのかな?軽く受け流して先に進んでみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ rails generate 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. Ensure you have defined default url options in your environments files. Here is an example of default_url_options appropriate for a development environment in config/environments/development.rb: config.action_mailer.default_url_options = { :host => 'localhost:3000' } In production, :host should be set to 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: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> 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. 5. You can copy Devise views (for customization) to your app by running: rails g devise:views =============================================================================== |
続いてはModelクラスを生成するコマンド。なんか生成された模様、次へ。
1 2 3 4 5 6 7 8 9 |
$ rails g devise User invoke active_record create db/migrate/006_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 |
下記をAppControllerに追加する。これで自動的に認証済かどうかを判断するのだろう。たったの一行だ。
1 |
before_filter :authenticate_user! |
ここまででひとまず画面を動かしてみる。やっぱり怒られた。devise_forメソッドがないよ?とのこと。
1 |
undefined method `devise_for' |
サーバを再起動しろという情報をどこかで見つけたので、script/rails serverを再起動。今度は別の理由で怒られる。あっそうか、Model生成したときにmigrateファイルも生成されたけどmigrate:dbやってたなかった。
1 2 |
ActiveRecord::StatementInvalid in Devise::SessionsController#new Mysql2::Error: Table 'events.users' doesn't exist: SHOW FULL FIELDS FROM `users` |
というわけでこれ。
1 |
rake db:migrate |
次はmysqlでusersテーブルを確認。こんなんが生成されてた。他の独自項目はmigrateで追加すればいいのかなきっと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
+------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | UNI | | | | encrypted_password | varchar(255) | NO | | | | | reset_password_token | varchar(255) | YES | UNI | NULL | | | reset_password_sent_at | datetime | YES | | NULL | | | remember_created_at | datetime | YES | | NULL | | | sign_in_count | int(11) | YES | | 0 | | | current_sign_in_at | datetime | YES | | NULL | | | last_sign_in_at | datetime | YES | | NULL | | | current_sign_in_ip | varchar(255) | YES | | NULL | | | last_sign_in_ip | varchar(255) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------------------+--------------+------+-----+---------+----------------+ |
Email:test@example.com
Password:password
でsignupしてみると、無事に内部の画面へ遷移。
再びmysqlでusersテーブルを確認。ちゃんとデータが登録されて暗号化パスワードが保存されてる。
1 2 3 4 5 |
+----+------------------+--------------------------------------------------------------+---------------------+ | id | email | encrypted_password | created_at | +----+------------------+--------------------------------------------------------------+---------------------+ | 1 | test@example.com | $2a$10$4wNlyxXcKO8uV/VwxxNyDuY79lmUJSUtDQAfh7COom8Q1/n9W3/cO | 2013-03-04 12:06:33 | +----+------------------+--------------------------------------------------------------+---------------------+ |
ちょっと動作確認。
localhostのcookieを削除してSessionを破棄して内部のページにリクエストする。要するにログアウトしている状態。ちゃんとログイン画面に飛ばされた。ほとんど何も考えずここまでできるとは至れり尽くせりってやつだ!
Signup(登録機能)も、パスワードリセット機能も最初から出来上がってる。イケメンすぎる!恐るべし、Rails。
つけたし
ログインしているユーザー情報にアクセスしたい場合があると思う。ちょっと例をあげておこう。
例えばログイン状態をチェック。
1 |
user_signed_in? |
viewでこんな感じで使える
1 2 3 4 5 6 |
<% if user_signed_in? %> ログイン成功!<br /> <%= p current_user.email %><br /> <% else %> ログイン失敗! <% end %> |
あとはroutes.rbでルーティングを変更するなり、before_filterをつけるControllerを変更するなり、Usersのmigrateファイルを変更するなりで調整すればいい。実に簡単だ!

原田 敦

最新記事 by 原田 敦 (全て見る)
- Rails Engineでブログ機能追加するgemを作る - 2015年3月15日
- WEBエンジニア一人だけでサービスを作りきる方法-夫婦のための自動ごはん予定お知らせサービス「GoHaaan」制作でやったこと - 2015年3月7日
- CentOS6でMariaDBのDynamic Columnsを試してみた - 2015年2月28日