2012-02-10 10 views
17

Confirmableモジュールを有効にすると、未定義のユーザーは事前定義された時間の経過後にサインインできません。その代わりに、ユーザーは、「続行する前にアカウントを確認する必要があります」というフラッシュメッセージでサインインページにリダイレクトされます。Devise with Confirmable - ユーザーが未確認の電子メールでサインインしようとすると、ユーザーをカスタムページにリダイレクトします。

フラッシュ通知は、アクセスが拒否された理由、「あなたのアカウントの確認」の意味、確認の再送信のためのリンクの提供、および手順をユーザに適切に説明するための適切なスペースを提供しないため、望ましくない対話モデルです。あなたの迷惑メールフォルダをチェックする方法などについて。

この動作を変更して特定のURLにリダイレクトする方法はありますか?

答えて

27

初めて申し訳ありませんが、サインアップしないでください。そこで、以下のダウンは、ユーザーが後にサインアップ向け方のために働くとどのようなカスタムを作成することです、サインインのために行う必要がある考案:: FailureApp

wikiページを参照してください。そして、あなたのカスタムFailureApp内https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

をカスタムリダイレクトについて

def redirect_url 
    if warden_message == :unconfirmed 
     custom_redirect_path 
    else 
     super 
    end 
    end 

後にサインアップ:https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rbからredirect_urlメソッドを上書き

をRegistrationsContro内のコントローラメソッドafter_inactive_sign_up_path_forがありますあなたはこれを達成するために上書きすることができます。

devise_for :users, :controllers => { :registrations => "users/registrations" } 

第二に、あなたがメソッドを上書きするために、通常のコントローラから継承するカスタムコントローラを作成します。

config/routes.rb:あなたのルートの最初の

あなたのカスタムコントローラを使用するように指定する必要があります:

app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController 

    protected 

    def after_inactive_sign_up_path_for(resource) 
    signed_up_path 
    end 

end 

私のアプリケーションの場合、私のDeviseモデルはUserなので、モデルの名前が違う場合は、その名前空間を変更することができます。ユーザーがsigned_up_pathにリダイレクトされることを希望しましたが、希望のパスに変更することができます。

9

私はこれをやったが、別のアプローチをとった。アプリ/コントローラ/ sessions_controller.rbで

class SessionsController < Devise::SessionsController 

    before_filter :check_user_confirmation, only: :create 

    # 
    # other code here not relevant to the example 
    # 

private 

    def check_user_confirmation 
    user = User.find_by_email(params[:email]) 
    redirect_to new_confirmation_path(:user) unless user && user.confirmed? 
    end 
end 

は、これは私のために働いた低侵襲見えました。私のアプリでは、新しいセッションはいつもsessions#createを経由しなければならず、ユーザーは常に自分のメールアドレスでサインインするので、これはあなたより簡単なケースかもしれません。

もちろんredirect_tocheck_user_confirmationメソッドで希望する任意の場所を指定できます。 new_confirmation_pathは私にとって論理的な選択でした。なぜなら、ユーザーに確認するためのリソースを提供するからです。

+0

一つの質問を:どのように私は彼が、ユーザー名や電子メールを使ってログインできるユーザーを見つけることができますか?したがって、 ':login'をパラメータとして取得します。これはユーザの電子メールまたはユーザ名になります。 – jonhue

0

これはあなたの追加する必要があるソリューションです:セッションの下のdeviseロケールで未確認のメッセージです。アプリ/コントローラ/ sessions_controller.rbで

def check_user_confirmation 
    user = User.where(email: params[:user][:email]).take 

    unless user && user.confirmed? 
     set_flash_message! :alert, :unconfirmed 
     expire_data_after_sign_in! 
     respond_with user, location: after_inactive_sign_up_path_for(user) 
    end 
    end 

    protected 

    def after_inactive_sign_up_path_for(resource) 
    new_user_session_path 
    end 
関連する問題