ユーザーは、多くの Web アプリケーションにおいて中心となるコンポーネントの1つです。Volt はユーザーをフレームワークに取り込むことで標準化しています。
Voltのユーザーに関する機能は開発中の段階です。サードパーティのサービス経由でログインできるように、omniauth のサポートを計画中です。現在は E メールまたはユーザー名とパスワードのオプションのみが提供されています。
Volt は volt-user-templates gem を最初から組み込んでいます。まず、ユーザーの使いかたについて見てみましょう。その次に、独自のサインアップページとログインページの作成方法について説明します。
volt-user-template はサインアップとログインのためのテンプレートを提供します。それらは、デフォルトのルーティングテンプレートによってレンダリングされます。Volt は /signup
と /login
を routes.rb
に定義しています。タグを使ってテンプレートのレンダリングをすることも可能です。詳しくは、volt-user-templates の readme を参照してください。
現在のユーザーモデルには Volt.current_user
でアクセスすることができます。これは最初はnilを返しますが、サーバーからデータが取得でき次第、ユーザーのデータがリアクティブに更新されます。もしユーザーが返ってくるまで待つ必要がある場合には、Volt.fetch_current_user
を利用することができます。これは、ユーザーが読み込まれたときに解決するpromiseを返します。もしユーザーがログインしていなれければnilで解決します。
Volt は、モデルの変更をある特定のユーザーのみに制限するためのヘルパーを備えています。詳細はパーミッション を参照してください。
ユーザーのログインは以下を実行します:
Volt.login(login, password)
上記において、login
は、ユーザー名か E メールのいずれかを使うように設定することができます。Volt.login
は promise を返し、ログインに成功した場合に解決 (resolve) され、ログインに失敗した場合には、エラーメッセージとともに失敗 (fail) します。
Volt.login(email, password).then do
# ログイン成功時はリダイレクト
go '/dashboard'
end.fail do |error|
# ログイン失敗 (エラーあり)
flash._errors << error
end
ユーザーのログアウトは以下を実行します:
Volt.logout
これは即座に実行され、Volt.current_user
に対して変更 (change) イベントをトリガーします。
タスク、もしくは HttpController において、以下のようにすると直接ユーザーとしてログインすることができます。
login_as(user)
このとき、user は User のインスタンスを指定します。
ユーザーを作成する例は volt-user-templates を見てください。
Volt は Volt::User
クラスを備えており、すべてのモデルが継承することができます。デフォルトでは、Volt は、app/main/models/user.rb
で User モデルを提供しています。
ログインのために Volt::User
がデフォルトで使うのは email
プロパティですが、代わりに username
を使うようにアプリケーションを構成することもできます。そのためには、config/app.rb
に以下を追加してください。
config.public.auth.use_username = true
Volt::User
は、email
や username
に対してのバリデーションも提供しています。パスワードは password
プロパティに格納されます。パスワードは bcrypt を使ってハッシュ化され、 hashed_password
に格納されます。hashed_password
を直接扱うことがあってはいけません。
ユーザーの作成には、通常のストアコレクションを利用します:
def index
self.model = store._users.buffer
end
ユーザー作成時のエラーを表示するためには、volt-fields を利用することができます。
Volt::ModelController には require_login
メソッドが用意されており、ユーザーがログインしているかをチェックし、ログインしていなければログインページにリダイレクトさせることができます。また、ログインのフラッシュメッセージを表示することもできます。
:require_login の before action を利用すれば、特定のアクションのみでログインを要求することが可能です。
module Main
class MainController < Volt::ModelController
before_action :require_login
def index
end
end
end
require_loginにはカスタムメッセージを設定することが可能です。また、フラッシュメッセージを表示させたくない場合にはnilを指定してください。
module Main
class MainController < Volt::ModelController
before_action do
require_login('Login or else')
end
def index
end
end
end