Railsで使えるGem

Rails3.2のアプリにユーザー機能を追加する~Devise

投稿日:2012年11月17日 更新日:

はじめに

アプリにユーザー機能を追加するためにdeviseというgemを使った

deviseを使えば高機能なユーザー管理機能を簡単につけることができる

参考

Rails3.2+Mongoidでログイン機能~devise

Deviseのユーザーと既存のMongoidモデルを関連づける

インストール

Gemfile

bundle

generate

 専用モデル作成

 初期設定など

前に書いた記事のとおり、インストール後の指示に従って設定する

  • メールの設定
  • ルートアドレスの設定
  • noticeとalertの通知の設定
  • herokuを使う場合のアセットコンパイルの設定

次にやること

  • サインイン・サインアウトのリンクの設定
  • サインイン状態のとき、サインアウト状態のとき、できること、できないことを設定する

サインイン・サインアウトのリンクの設定

サインイン・サインアウトのパスは、rake routesでわかるnew_user_sessionとdestroy_user_session

そして、viewのなかでログイン状態かどうかは便利なヘルパーが準備されていてuser_signed_in?でチェックできる

こんな感じで書けばよくある感じになる

サインイン状態・サインアウト状態のときにできること、できないことを設定する

こちらにも便利なメソッドが用意されていて authenticate_user!でできるメソッドを選べる

サインアウト状態のときに設定したページにアクセスしようとするとサインイン画面に飛ばされる

メッセージを日本語化する

インストールすれば、config/locales/devise.en.ymlができているので、これを翻訳すればいいけど、翻訳版を公表してくれている人がいる

raw.github.com/gist/606476/15605bdbc28067c7983cefae3ae12105ee93c243/devise.ja.yml

デバイスモデルにカラムを追加

emailをアクセス名にしているけどユーザー名もつけたいとき

こんなmigrationファイルができてればOK

rake db:migrate

最後にnameにアクセスできるようにUserモデルを設定する

 

サインアップできないように設定する

deviseは便利なmoduleが基本で12個ついてきて機能をいろいろ選べる.

  • Database Authenticatable: encrypts and stores a password in the database to validate the authenticity of a user while signing in. The authentication can be done both through POST requests or HTTP Basic Authentication. データベースにパスワードを暗号化して保存することによって、認証を確認する.認証はPOSTリクエストでもHTTP Basc Authenticationでもできる.
  • Token Authenticatable: signs in a user based on an authentication token (also known as “single access token”). The token can be given both through query string or HTTP Basic Authentication. 認証トークンにもとづいてサインインする。(これはシングルアクセストークンとしても知られている).このトークンはクエリー文字列?でもHTTP Basic Authenticationでも与えられる.
  • Omniauthable: adds Omniauth (github.com/intridea/omniauth) support; Omuniauthをサポート
  • Confirmable: sends emails with confirmation instructions and verifies whether an account is already confirmed during sign in. 確認のためのメールを送信して、サインインしている最中にアカウントが確認されたかどうかを確かめる.
  • Recoverable: resets the user password and sends reset instructions. ユーザーパスワードをリセットして、リセットのメールを送る.
  • Registerable: handles signing up users through a registration process, also allowing them to edit and destroy their account. 認証プロセスを通じたユーザーのサインアップ(登録)を扱う、またユーザー情報の編集と削除を許す.
  • Rememberable: manages generating and clearing a token for remembering the user from a saved cookie. 保存されたクッキーによってユーザーを覚えておくためのトークンを生成したり、削除したりすることを管理する.
  • Trackable: tracks sign in count, timestamps and IP address. サインインした回数、時刻、IPアドレスを保存する.
  • Timeoutable: expires sessions that have no activity in a specified period of time. 特定の期間を経過してもアクションがない場合にセッションを期限切れにする.
  • Validatable: provides validations of email and password. It’s optional and can be customized, so you’re able to define your own validations.  メールとパスワードのバリデーションを提供する.これは選択的でカスタマイズもできるし、自分自身のバリデーションも定義できる.
  • Lockable: locks an account after a specified number of failed sign-in attempts. Can unlock via email or after a specified time period. 特定の回数サインインに失敗した場合、アカウントを凍結する.メールを通じてか、特定の期間を経過後にこれを解除できる.

 

意訳だし間違ってるかも

 

誰でもユーザー登録ができる機能は:registerableだから、これをコメントアウトすればOK

rake routesでルートも削除されるし、サインイン画面にあったsign upのリンクも消える

もし消えない場合はサーバーを再起動すると反映されるかもしれない

 

confirmable

メールアドレスを確認するためのメールを送信し、メールからリンクをクリックすると正式登録されるというギミック.

途中から追加する場合にはマイグレーションファイルを作る.
参考: undefined local variable or method `confirmed_at’ for #User

設定など

lockable

ログインに失敗し続けると、一定期間アカウントをロックする機能.

マイグレーションファイルを同様につくる.
参考: How to make Devise lockable with number of failed attempts

設定ファイルなど

FactoryGirlを使ってseedで初期ユーザーを登録する

最近だんだんとFactoryGirlと仲良くなってきた気がするよ.

まず、factoryを用意する

初期設定用のユーザーを準備する

次にdb/seeds.rbでこれをrequireする

今回はユーザーを全部削除するようにした

で、rake db:seed

*herokuにアップしたらうまくseedが動かなかったorz

rspecでdeviseサインイン状態にする

さて、deviseのアクセス制限を設定するとテストが軒並み通らなくなって涙目になる.

いままでのテストはサインイン状態でアクセスするようにしたい.

参照

RubyとRailsのテスト関係のリンクメモ

もし、:confirmableモジュールを使っているなら簡単な方法があるっぽい

Rails – Devise User Sign In for RSpec

今回は、:confirmableを使わないので、ちょっとめんどくさい

けど、リンク先に従えば動いた

How To: Controllers and Views tests with Rails 3 (and rspec)

まず、spec/spec_helper.rbのRSpec.configureの中にDeviseのTestHelpersをインクルードする

次に、spec/supportディレクトリを作って、contoroller_macros.rbというファイルを作成する

:confirmableを使ってないのでconfirm!を呼ぼうとするとエラーになる

で、これはextend

controllerのspecファイルでlogin_adminを呼べばいい.

参照先にあるようにitの外で呼ぶ.下手にbeforeの中とかで呼ぼうとしたらうまく動かなかった.

 

フォームの見た目を変える

フォームのViewをgenerateできるので、書き換えればよい.(Overrideする.)

メールの送信設定をする

Ruby on Rails ~ deviseでアプリにユーザー認証、サインアップ、ログイン機能をつける(開発環境&本番環境)(コードメモ)

sendgrid.comからユーザー登録した場合.
user_nameは常にapikey←注意.

gmailのsmtpを開発環境で使う場合

-Railsで使えるGem
-, ,

執筆者:

関連記事

backbone-railsのscaffoldで生成されるコードでルーティングとCRUDの処理をどうやってるのか読んでみた

By: asobi tsuchiya   目次1 はじめに2 サンプルの準備3 初期化4 ルーター5 READ6 CREATE7 UPDATE8 DELETE はじめに backbone-r …

Rails3.2でリアルタイムメッセージング~Private_pub、Faye

  Railsで簡単に非同期通信ができるPrivate_pubというgemを試した もともとrubyにはFayeという非同期通信ができるgemがあったが、簡単に安全な接続ができる実装を加えた …

no image

Rails3.2からBackbone.jsとD3.jsを使う一例

目次1 Backbone.jsからD3.jsを使う2 RailsのネストしたURLでBackboneを使う Backbone.jsからD3.jsを使う d3.jsで力指向グラフを使って遊ぶ2のクラス構 …

Rails4.0でもajaxなデータテーブルを使う~ajax-datatables

Railsでajaxなテーブルを使う~datatables Rails4でのJSONテンプレート~jbuilder+rabl+ruby 目次1 index.json.jbuilder2 tasks.j …

no image

Ubuntu ServerのGuardからネットワーク経由でWindowsのブラウザをリロードする~guard-livereload

Ubuntu12.04.1でCoffeeScriptの自動makeとブラウザの自動リロード~guard-coffeescript   Ubuntu ServerのGuardからGrowl f …