Rails 3.2 Mongoid devise メール確認によるサインナップ :confirmable、招待 :invitable


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

古いバージョンのRailsを指定して、アクティブレコードを外してRailsアプリケーションを作成
[bash]
$ rails _3.2.17_ new app –skip-active-record
$ cd app
[/bash]
–skip-active-recordは-OでもOK

Mongoidとdevise関連のgemをインストール
[ruby title=”Gemfile”]
gem "mongoid"
gem "devise"
gem "devise_invitable"
[/ruby]

[bash]
$ bundle install –path vendor/bundle

Installing devise (3.2.3)
Installing devise_invitable (1.3.4)

Installing mongoid (3.1.6)

[/bash]

Mongoidの設定ファイルを生成
http://mongoid.org/en/mongoid/docs/installation.html
[bash]
$ rails g mongoid:config

create config/mongoid.yml
[/bash]

認証テスト用のコントローラを作成
[bash]
$ 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
[/bash]

deviseのセットアップ
[bash]
$ 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

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

1. メール送信設定
動作確認なので、とりあえずsendmailコマンドでメールを送信
[ruby title=”vconfig/environments/development.rb” highlight=”2,3″]
# config.action_mailer.raise_delivery_errors = false
config.action_mailer.delivery_method = :sendmail
config.action_mailer.default_url_options = { :host => ‘localhost:3000’ }
[/ruby]
postfixが設定して無い場合はこの辺りを参考にしてセットアップしておく
Configuring Postfix to Send Mail from Mac OS X Mountain Lion

2. rootの設定
手順の指示通りに、先ほど作成したhome_controller#indexを指定
[ruby title=”config/routes.rb” highlight=”3″]
# You can have the root of your site routed with "root"
# just remember to delete public/index.html.
root :to => ‘home#index

[/ruby]
welcomeページは削除しておく
[bash]
$ rm public/index.html
[/bash]

3. レイアウトにflashメッセージの表示を追加
[ruby title=”app/views/layouts/application.html.erb” hightlight=”10,11″]
<!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>
[/ruby]

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

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

認証ユーザ用モデルを生成
[bash]
$ 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
[/bash]

home_controllerに認証をかける
[ruby title=”app/controller/home_controller.rb” hightlight=”2″]
class HomeController < ApplicationController
before_filter :authenticate_user!
def index
end
end
[/ruby]

メール確認(:confirmable)を有効にする
[ruby title=”app/model/user.rb” language=”7,”]
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

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

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

最後にdevise-invitableで、他のユーザを招待できるようにします。
コマンドで必要なファイルを生成し、userモデルに設定を追加します。
[bash]
$ 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
[/bash]
deviseメソッドの引数に:invitableが追加されています。
fieldは手動で追加する必要があります。
[ruby]
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} )
[/ruby]
インデックスを反映します。
[bash]
$ rake db:mongoid:create_indexes
[/bash]
Scope view を有効にします。
[ruby title=”config/initializers/devise.rb” highlight=”5″]
# ==> 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
[/ruby]

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

補足

sign_outをGETメソッドで実行したい
[ruby title=”config/initializers/devise.rb”]
# The default HTTP method used to sign out a resource. Default is :delete.
# config.sign_out_via = :delete
config.sign_out_via = :get
[/ruby]

,