3

デバイスユーザー向けの非常にシンプルなサインインページがあります。間違ったデータを送信すると、ログに「401 Unauthorized」と表示され、sign_in ページにリダイレクトされます。ユーザーにエラー メッセージを表示する方法がわかりませんでした。

devise::sessions_controller#create私は次のように、どれを見ました、


 # POST /resource/sign_in
  def create
    resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end

  def auth_options
    { :scope => resource_name, :recall => "#{controller_path}#new" }
  end  

認証が失敗した場合、フローは中断されwarden.authenticate、ユーザーはサインイン ページである「新しい」ページにリダイレクトされます。

ユーザーにinvalid_credentialsツールチップ/flash_messageを表示するだけです。そのため、認証が失敗したときを変更して、エラーメッセージを設定しました。:recall => "#{controller_path}#handle_create_fail" (look at auth_options) which calls handle_create_fails

devise がすでに提供しているものを見落としたかどうかはわかりません。

どうすればこれをうまく処理できますか?

4

3 に答える 3

3

「devise」はエラーメッセージをレールの「flash」に保存しflash[:notice]、成功メッセージとflash[:alert]問題に使用します。

デバイスのドキュメントからのこれは次のとおりです。

Devise はフラッシュ メッセージを使用して、サインインが成功したか失敗したかをユーザーに知らせることに注意してください。Devise は、アプリケーションが必要に応じて「flash[:notice]」と「flash[:alert]」を呼び出すことを想定しています。

これは、ビュー ファイル (より一般的にはアプリケーション レイアウト ファイル) に次のような行を含める必要があることを意味します。

<%= content_tag(:div, flash[:error], :id => "flash_error") if flash[:error] %>
<%= content_tag(:div, flash[:notice], :id => "flash_notice") if flash[:notice] %>
<%= content_tag(:div, flash[:alert], :id => "flash_alert") if flash[:alert] %>

同様の質問/回答を次に示します。

Rails - Devise - サインイン時のエラーメッセージ?

デバイス エラーが 2 回表示される

devise - ユーザー編集ページのカスタマイズ

于 2012-05-04T12:47:56.653 に答える
0

ほとんどの Rails フォームに見られるような、フォーム固有のエラー メッセージに沿って (レイアウト全体のグローバル フラッシュとは対照的に)、同様のことができるようにしたいと考えていました。

この Github gist で私が思いついたことを確認できます: https://gist.github.com/3792471

基本的に (以下のメモは のデバイス スコープを想定しています:user):

  • FailureAppdevise+warden で使用されるcustom を追加/使用します。これは単に「スコープ」 flash「インジケーター」を追加します。つまり、devise+warden がログインに失敗したためにすぐに終了し、したがって を設定している場合はflash.now[:alert]、追加します。flash.now[:user] = [:alert]
  • 拡張してFormBuilder(実際にはSimpleForm::FormBuilder、私の要点ですが、他のユーザーと連携する必要があります)#flash、スコープ付きインジケーターをチェックするメソッドを追加します。見つかった場合、一致が から抽出/削除され、FlashHashレンダリングされます。見つからない場合 (つまり、flash[:alert]存在する場合も存在しない場合もありますが、flash[:user]存在しないか含まれていない場合:alert)、デフォルトのユースケースでフラッシュを引き続き使用できるように何もしません。
  • 関連するビュー/レイアウトにレンダリングを追加します。

私の例の要点のレイアウトには、レイアウトでレンダリングされたフラッシュ メッセージに関する条件付きロジックがないことに注意してください。さまざまな状況で何が表示され、何が表示されないかをテストできました。

于 2012-09-28T04:18:17.387 に答える
0

正しく理解できているかどうかわかりませんが、ビュー (sign_in.html.erb) に 'alert' を配置するだけで、Devise はエラー メッセージを表示します。

<div class="alert">
  <%= alert %>
</div>
于 2012-05-04T12:36:13.077 に答える