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

Ruby on Rails
Ruby on Rails / Andrew*

前回に引き続き、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にアクセスしてみましょう。

Community manager rails 2013 04 28 11 52

グレイト!

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 => (パスワード),
}

ユーザ登録してみる

Community manager rails 2013 04 28 12 00

メールアドレスとパスワードを入力してSing upボタンをクリックすると、下記のような画面に遷移します。で、入力したメールアドレスに確認メールが届くのです。

Community manager rails 2013 04 28 12 02

届いたメールのConfirm my accountリンクをクリックすると・・・

Community manager rails 2013 04 28 12 04 2

グレイト!グレイト!

ログアウトできないよ?

ログアウトのリンクがないので、このままでは、ログアウトができません。でも、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><!--/.nav-collapse -->

すると・・・

Community manager rails 2013 04 28 12 15

グレイト!グレイト!グレイト!

Community manager rails 2013 04 28 12 16

グレイト!グレイト!グレイト!グレイト!

DeviseのViewを編集したい場合


rails g devise:vises

とすると、app/views/devise配下にファイルができるので、これを編集します。

まとめ

ということでいかがでしょうか。
前回のtwitter-bootstrap-railsから引き続きDeviseの導入も行いました。
これで、Webサービスのアプリケーションとしての枠組みはかなり完成されたと思います。
あとは、諸々の機能を付け足していけば良いですね。

この記事を書いた人

井上 研一

経済産業省推進資格ITコーディネータ/ITエンジニア。
合同会社井上研一事務所代表、株式会社ビビンコ代表取締役。
北九州市出身、横浜市在住。AIやIoTに強いITコーディネータとして活動。北九州市主催のビジネスコンテスト「北九州でIoT」に応募したアイディアが入選し、メンバーと株式会社ビビンコを創業。著書に「初めてのWatson」、「ワトソンで体感する人工知能」など。セミナーや研修講師での登壇多数。