18

Confirmableモジュールを有効にすると、Deviseは未確認のユーザーが事前定義された期間が経過した後にサインインすることを許可しません. 代わりに、ユーザーはサインイン ページにリダイレクトされ、「続行する前にアカウントを確認する必要があります」というフラッシュ メッセージが表示されます。

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

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

4

3 に答える 3

27

申し訳ありませんが、最初はサインアップ後にサインインではなく意味があると思いました。したがって、以下のダウンは、サインアップ後にユーザーを誘導する方法について機能し、サインインのために行う必要があるのは、カスタムDevise::FailureAppを作成することです。

wikiページを参照してください:https ://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

次に、 https : //github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rbのカスタムFailureApp上書きredirect_urlメソッド内で:

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

サインアップ後のカスタムリダイレクトの場合:

after_inactive_sign_up_path_forこれを実現するために上書きできるRegistrationsController内のコントローラーメソッドがあります。

ルートの最初に、カスタムコントローラを使用するように指定する必要があります。

config/routes.rb

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

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

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ですが、それを希望のパスに変更できます。

于 2012-02-10T07:48:01.537 に答える
10

私はこれをやっただけですが、別のアプローチを取りました。

app/controllers/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_to、メソッド内の任意の場所にすることができますcheck_user_confirmationnew_confirmation_path確認するためのリソースをユーザーに提供するため、私にとっては論理的な選択でした。

于 2013-10-17T17:58:00.220 に答える
0

これは、セッションの下のデバイスロケールに :unconfirmed メッセージを追加する必要がある私のソリューションです。

app/controllers/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
于 2017-08-11T03:30:17.307 に答える