前回に引き続き、Ruby on Railsです。
今回はDeviseに行きます。
Deviseを使うとプロダクトクオリティのログイン管理ができるじゃん
どんなWebフレームワークでもログイン管理機構は簡単に作れるようになっていますが、Devideは凄すぎる。何もしなくても、プロダクトクオリティじゃないのか!という。
こちらは、Rails3アプリにDeviseで簡単に認証システムを組み込む – hrendohの日記を参考にさせていただきました。
まずはGemfileの追記とbundle installです。
gem 'devise'
プロジェクトにDeviseをインストールします。
rails g devise:install
Deviseをインストールすると、その後にやることがメッセージで表示されます。基本的にはそのとおりに進めますが、他にやることもあるので・・・。
config/environments/development.rbを下記のように編集します。
# config.action_mailer.raise_delivery_errors = false ←コメントアウト
config.action_mailer.default_url_options = { :host => 'localhost:3000' } #この行を追加
Herokuに配置する場合は、config/environments/production.rbも編集します。
# for Heroku
config.assets.initialize_on_precompile = false
Userモデルを追加
rails g devise User
これでUserモデルとマイグレーションファイルができます。このままrake db:migrateしても良いのですが、今回はユーザ登録時にメールアドレスの認証をしたいと思うので、少し編集します。
app/models/user.rbに、:confirmableを追記します。
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
db/migrateにある(日時)_devise_create_users.rbのConfirmableの下にある4行のコメントアウトを外し、列を有効にします。
## Confirmable
t.string :confirmation_token
t.datetime :confirmed_at
t.datetime :confirmation_sent_at
t.string :unconfirmed_email # Only if using reconfirmable
これでDBにusersテーブルを作ります。
rake db:migrate
eventsコントローラに認証をかける
app/controllers/events_controller.rbで、Deviseでのユーザ認証が必要である旨を宣言します。
class EventsController < ApplicationController
before_filter :authenticate_user!
(省略)
end
ここまで進んだら、rails sでサーバを起動してhttp://localhost:3000/eventsにアクセスしてみましょう。
グレイト!
SMTPを設定する
今回はDeviseでConfirmableを設定しているので、ユーザ登録時にメールアドレスの認証がかかります。そのため、Railsアプリからメールを送信できるように、SMTPの設定が必要となります。
config/environment/development.rbに下記を追加します。
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:authentication => :plain,
:user_name => (メールアドレス),
:password => (パスワード),
}
ユーザ登録してみる
メールアドレスとパスワードを入力してSing upボタンをクリックすると、下記のような画面に遷移します。で、入力したメールアドレスに確認メールが届くのです。
届いたメールのConfirm my accountリンクをクリックすると・・・
グレイト!グレイト!
ログアウトできないよ?
ログアウトのリンクがないので、このままでは、ログアウトができません。でも、rake routesを実行してみると・・・
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
というように、/users/sign_outというパス(destroy_user_session_pathと書けばOK)にDELETEメソッドでアクセスすると良さそうです。
ということで、app/views/layouts/application.rbに下記のようなコードを追加しました。
<div class="container-fluid nav-collapse">
<ul class="nav">
<li><%= link_to "イベント", "/events" %></li>
</ul>
<div class="pull-right"><% if user_signed_in? %>
<%= link_to "ログアウト", new_user_session_path, :method => "DELETE", :class => "btn" %>
<% else %>
<%= link_to "ログイン", destroy_user_session_path, :class => "btn" %>
<% end %></div>
</div>
すると・・・
グレイト!グレイト!グレイト!
グレイト!グレイト!グレイト!グレイト!
DeviseのViewを編集したい場合
rails g devise:vises
とすると、app/views/devise配下にファイルができるので、これを編集します。
まとめ
ということでいかがでしょうか。
前回のtwitter-bootstrap-railsから引き続きDeviseの導入も行いました。
これで、Webサービスのアプリケーションとしての枠組みはかなり完成されたと思います。
あとは、諸々の機能を付け足していけば良いですね。