Ruby on Railsってtwitter-bootstrap-railsとDeviseを使ったらすぐにクールなアプリが作れるじゃん(その2)

前回に引き続き、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サービスのアプリケーションとしての枠組みはかなり完成されたと思います。
あとは、諸々の機能を付け足していけば良いですね。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。