deviseによる認証を組み込んだRails3アプリの作成
Railsのgemライブラリの「devise」を使うと、
簡単にRailsアプリにユーザ認証機能を組み込むことができます。
deviseへの設定は特に加えずに、
Railsアプリにのユーザ認証機能を組み込んでみました。
# 実際のアプリ開発では、
# この基本的な流れにカスタマイズを加えることが多いですが、
# 全部やってくれる分、カスタマイズにてこずることが多いようです。
rails/deviseのバージョンは以下の通りです。
・railsは 3.2.8
・deviseは 2.1.2
Railsアプリの作成
rails newでrailsアプリを作成します。
$ rails new app
create
create README.rdoc
create Rakefile
== 略 ==
Gemfileのtherubyracerのgemを以下のようにコメントアウトして、有効化。
== 略 ==
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer', :platforms => :ruby
== 略 ==
bundle installして、rails sでサーバを起動します。
$ bundle install
== 略 ==
Installing therubyracer (0.10.2) with native extensions
== 略 ==
$ rails s
=> Booting WEBrick
=> Rails 3.2.8 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-08-21 11:16:47] INFO WEBrick 1.3.1
[2012-08-21 11:16:47] INFO WEBrick::HTTPServer#start: pid=1837 port=3000
この状態で、ブラウザから
http://(ホスト名orIPアドレス):3000/
でアクセスして「Welcome aboard」が表示されることを確認します。
ここまでで、素のrailsアプリ作成が完了。
## deviseによる認証機能の追加
次にdeviseを使って、ユーザの認証機能を追加します。
まずは、Gemfileにdeviseのgemを追記。
```ruby
== 略 ==
gem 'devise'
== 略 ==
その後、bundle install, devise:installしてdeviseをインストールします。 ユーザ用のモデルとビューを生成します。 ここでは「user」というモデルを作っています。
$ bundle install
== 略 ==
Installing orm_adapter (0.4.0)
Installing warden (1.2.1)
Installing devise (2.1.2)
== 略 ==
$ 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 Rails 3.1 on Heroku, 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.
===============================================================================
$ rails generate devise:views
invoke Devise::Generators::SharedViewsGenerator
create app/views/devise/shared
create app/views/devise/shared/_links.erb
invoke form_for
create app/views/devise/confirmations
create app/views/devise/confirmations/new.html.erb
create app/views/devise/passwords
create app/views/devise/passwords/edit.html.erb
create app/views/devise/passwords/new.html.erb
create app/views/devise/registrations
create app/views/devise/registrations/edit.html.erb
create app/views/devise/registrations/new.html.erb
create app/views/devise/sessions
create app/views/devise/sessions/new.html.erb
create app/views/devise/unlocks
create app/views/devise/unlocks/new.html.erb
invoke erb
create app/views/devise/mailer
create app/views/devise/mailer/confirmation_instructions.html.erb
create app/views/devise/mailer/reset_password_instructions.html.erb
create app/views/devise/mailer/unlock_instructions.html.erb
$ rails generate devise user
invoke active_record
create db/migrate/20120821023255_devise_create_users.rb
create app/models/user.rb
invoke test_unit
create test/unit/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
route devise_for :users
$ rake db:migrate
== DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
-> 0.0059s
-- add_index(:users, :email, {:unique=>true})
-> 0.0138s
-- add_index(:users, :reset_password_token, {:unique=>true})
-> 0.0010s
== DeviseCreateUsers: migrated (0.0210s) =====================================
この時点でrake routesすると、 サインイン・サインアップなどのユーザ認証機能が用意されていることが確認できます。
$ rake routes
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
各ページにdeviseに関するアラートを表示するように、 「app/views/layouts/application.html.erb」に 以下のように、notice, alert表示の2行を追記します。
<body>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
</body>
ログイン状態に応じて、 ログイン・ログアウトボタンを表示するためにトップページを作成します。
$ rails g 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
「app/views/home/index.html.erb」を以下のように編集し、 ログイン・ログアウトボタンを設置します。
<% if user_signed_in? %>
<%= link_to "ログアウト", destroy_user_session_path, :method => 'delete' %>
<%= link_to "ユーザ情報の編集", edit_user_registration_path %>
<% else %>
<%= link_to "ログイン", new_user_session_path %>
<%= link_to "登録", new_user_registration_path %>
<% end %>
「config/route.rb」に以下の行を追加して、ルートページを「/home/index」にします。
root :to => "home#index"
デフォルトのルートページは、リネームしておきます。
$ mv public/index.html public/index.html.bak
ここまで生成したら、再度「rails s」でrailsを起動。 以下のURLにアクセスすると ログイン・登録と表示されたルーとページが参照できます。 http://(ホスト名orIPアドレス):3000/ 登録から進み、メールアドレスとパスワードを入力して会員登録します。
会員登録後、ログイン・ログアウトができることが確認できます。
とりあえず認証を組み込むだけなら、まずはここまででしょうか。