前提: Rubyおよびrailsとbundlerのgemはインストール済み

古いバージョンのRailsを指定して、アクティブレコードを外してRailsアプリケーションを作成

$ rails _3.2.17_ new app --skip-active-record
$ cd app

–skip-active-recordは-OでもOK

Mongoidとdevise関連のgemをインストール

gem "mongoid"
gem "devise"
gem "devise_invitable"
$ bundle install --path vendor/bundle
...
Installing devise (3.2.3)
Installing devise_invitable (1.3.4)
...
Installing mongoid (3.1.6)
...

Mongoidの設定ファイルを生成
http://mongoid.org/en/mongoid/docs/installation.html

 $ rails g mongoid:config

      create  config/mongoid.yml

認証テスト用のコントローラを作成

$  rails generate 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

deviseのセットアップ

$ 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 on Heroku with Rails 3.2 only, 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

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

表示された手順に従ってセットアップしていきます。

1. メール送信設定
動作確認なので、とりあえずsendmailコマンドでメールを送信

  # config.action_mailer.raise_delivery_errors = false
  config.action_mailer.delivery_method = :sendmail
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

postfixが設定して無い場合はこの辺りを参考にしてセットアップしておく
Configuring Postfix to Send Mail from Mac OS X Mountain Lion

2. rootの設定
手順の指示通りに、先ほど作成したhome_controller#indexを指定

  # You can have the root of your site routed with "root"
  # just remember to delete public/index.html.
  root :to => 'home#index

welcomeページは削除しておく

$ rm public/index.html

3. レイアウトにflashメッセージの表示を追加

<!DOCTYPE html>
<html>
<head>
  <title>App</title>
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>
</head>
<body>
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>
<%= yield %>

</body>
</html>

4. developmentで試すのでスキップ

5. viewのカスタマイズをしないのでスキップ

認証ユーザ用モデルを生成

$ rails generate devise user
      invoke  mongoid
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
      insert    app/models/user.rb
       route  devise_for :users

home_controllerに認証をかける

class HomeController < ApplicationController
  before_filter :authenticate_user!
  def index
  end
end

メール確認(:confirmable)を有効にする

class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable
...

  ## Confirmable
  field :confirmation_token,   :type => String
  field :confirmed_at,         :type => Time
  field :confirmation_sent_at, :type => Time
  field :unconfirmed_email,    :type => String # Only if using reconfirmable

:confirmableを追加して、上記の4つのフィールドのコメントを外します。

ここまでで、ユーザのサインナップはメール確認が必須になります。

最後にdevise-invitableで、他のユーザを招待できるようにします。
コマンドで必要なファイルを生成し、userモデルに設定を追加します。

$ rails generate devise_invitable:install
      insert  config/initializers/devise.rb
      create  config/locales/devise_invitable.en.yml
$ rails generate devise_invitable user
      insert  app/models/user.rb
      invoke  mongoid

deviseメソッドの引数に:invitableが追加されています。
fieldは手動で追加する必要があります。

class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :invitable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable

  ## Invitable
  field :invitation_token, type: String
  field :invitation_created_at, type: Time
  field :invitation_sent_at, type: Time
  field :invitation_accepted_at, type: Time
  field :invitation_limit, type: Integer

  index( {invitation_token: 1}, {:background => true} )
  index( {invitation_by_id: 1}, {:background => true} )

インデックスを反映します。

$ rake db:mongoid:create_indexes

Scope view を有効にします。

  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  config.scoped_views = true

ユーザを招待するには、ログイン後、http://localhost:3000/users/invitation/new にアクセスします。

補足

sign_outをGETメソッドで実行したい

  # The default HTTP method used to sign out a resource. Default is :delete.
  # config.sign_out_via = :delete
  config.sign_out_via = :get