2011-01-11 11 views
41

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

私はAuthlogicとDeviseの両方を使用しており、それぞれに長所と短所があると思います。 Deviseを使って、私は新しいプロジェクトを "速く進める"ことが大好きですが、それをカスタマイズすることは苦痛であるようです。 AuthlogicにはRails 3の問題がたくさんありましたが、私はDeviseに切り替えました。私は現在、新しいプロジェクトに取り組んでおり、最初から始めようとしています。

この質問には2つの潜在的な回答があると思います。(a)Deviseでこれを行う方法、または(b)なぜAuthlogicをRails 3に切り替えるべきなのか。

+0

あなたの受け入れられた回答は、DeviseとAuthlogicの両方で有効です。 –

答えて

76

あなたはsign_in前に、新しく作成したユーザーsign_in @user

+0

Authlogicでもまったく同じコードが動作します(バージョン1.4.4.1を実行しています)。 –

+0

ここでは、sign_inという名前の関数が存在することをどのように知っているのでしょうか? – codeAnand

+2

Read meのhttps://github.com/plataformatec/deviseの「テストヘルパー」のセクションで確認できます。 http://rubydoc.info/github/plataformatec/devise/master/frames –

7

の保存を使用して、新しく作成したユーザーでサインインして(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 

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

この問題に対処するために、私は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 
+2

sign_inを呼び出す前に明示的にユーザーを保存しても問題が引き続き発生するかどうか尋ねることができますか? それでも問題が解決しない場合は、保存した後、sign_inの前にユーザーをリロードするための呼び出しを追加しますか? – m3z

4

...

これを実行するための簡単な方法では、次のような行を持つべきであるあなたの

config/routes.rb 

である:

devise_for :users 

だから、deviseが使用するパス接頭辞を追加するだけでよい:

devise_for :users, :path_prefix =>'auth' 

希望します。

関連する問題