web-dev-qa-db-ja.com

Deviseで新しいユーザーとユーザーセッションを手動で作成する方法

Railsで多くの情報を収集するフォームがあります。このフォームの一部は、新規ユーザーが登録するフィールドです。 Deviseには、特に新しいユーザーを作成するためのコントローラー/アクションがあるため、別のレコードを作成するまったく異なるアクションでユーザーをプログラムで作成する方法がわかりません。ユーザー登録フォームを個別に用意することはできません。 Authlogicで簡単にできるように、ユーザーを作成してログインする方法がわかりません。

私はAuthlogicとDeviseの両方を使用しましたが、それぞれに長所と短所があると思います。 Deviseを使用すると、新しいプロジェクトを「すぐに始める」ことがどれほど迅速かが気に入っていますが、それをカスタマイズするのは苦痛のようです。 AuthlogicにはRails 3で多くの問題があったため、Deviseに切り替えました。現在、新しいプロジェクトに取り組んでおり、ゼロから始めています。

したがって、この質問には2つの潜在的な答えがあると思います。(a)Deviseでこれを行う方法、または(b)代わりにRails 3でAuthlogicに切り替える必要がある理由。

47
Sean Coleman

新しいユーザーモデルを作成するだけで、新しいDeviseユーザーを作成できます( https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interfaceを参照してください

@user = User.new(:email => '[email protected]', :password => 'password', :password_confirmation => 'password')
@user.save

新しく作成したユーザーにサインインするには、sign_in @user

84
David Sulc

DeviseがまだUserオブジェクトの必須フィールドに入力していないため、sign_inの前に新しく作成されたユーザーの保存は失敗します。したがって、Davidのコードは現在のページで機能しますが、セッションが設定された後にのみユーザーが保存されるため、次のページはサインインしているユーザーを取得しません。これは私がMongoidを使用しているときに起こり、Mongodb特有の問題かどうかわかりません。

この問題に対処するには、sign_inを2回呼び出す非常に不完全なソリューションがあります。最初のsign_inはユーザーを保存します。それは機能しますが、人々は確かにそれを改善できます。

@user = User.new(:email => '[email protected]',
                 :password => 'password',
                 :password_confirmation => 'password')
# This will save the user in db with fields for devise
sign_in @user
# :bypass is set to ignore devise related callbacks and only save the
# user into session.
sign_in @user, :bypass => true 
8
vanship82

この質問を見ている新しい人々のために...

これを行う簡単な方法は

config/routes.rb

次のような行が必要です。

devise_for :users

そのため、deviseが使用するパスプレフィックスを追加するだけです。

devise_for :users, :path_prefix =>'auth'

それが役に立てば幸い!

4
Raúl Contreras