登录时优雅地处理设计401

时间:2012-05-04 10:07:20

标签: ruby-on-rails devise

我为一个设计用户提供了一个非常简单的sign_in页面。提交错误数据后,日志显示“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中断,并且用户会被重定向到“新”,即sign_in页面。

我只需要向用户显示invalid_credentials tooltip / flash_message。所以我通过在身份验证失败时修改:recall => "#{controller_path}#handle_create_fail" (look at auth_options) which calls handle_create_fails 来做到这一点,我在其中设置了错误消息。

我不确定我是否忽略了已经提供的设计。

我怎样才能更好地处理这个问题?

3 个答案:

答案 0 :(得分:3)

'devise'在rails'flash'中存储错误消息,使用flash[:notice]表示成功消息,flash[:alert]表示问题。

这是来自devise documentation

的内容
  

请记住,如果登录,Devise会使用Flash消息让用户知道   成功或失败。 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 - Error messages when signing in?

Devise errors are displayed twice

devise - Customizing the User Edit Pages

答案 1 :(得分:0)

我不确定我是否正确理解您,但只需在您的视图中放置'alert'(sign_in.html.erb),Devise就会闪烁错误消息。

<div class="alert">
  <%= alert %>
</div>

答案 2 :(得分:0)

我希望能够做类似的事情,就像你在大多数Rails表单上可能有的特定于表单的错误消息一样(而不是布局范围的全局闪存)。

你可以在这个Github要点中查看我的想法:https://gist.github.com/3792471

基本上(下面的注释假设:user的设计范围):

  • 添加/使用由devise + warden使用的自定义FailureApp,只需添加“范围”flash“指标”。也就是说,如果由于登录失败而导致devise + warden快速退出,因此设置flash.now[:alert],添加flash.now[:user] = [:alert]
  • 在我的要点中扩展FormBuilder(实际上,SimpleForm::FormBuilder,但应该与其他人合作)添加#flash方法,该方法会检查范围指示符。如果找到,则从FlashHash中提取/删除匹配并进行渲染。如果未找到(即,flash[:alert]可能存在,也可能不存在,但flash[:user]不存在或不包含:alert),则不执行任何操作以使闪存仍可用于默认使用情况下。
  • 将渲染添加到相关视图/布局。

请注意,我的示例gist中的布局没有围绕布局呈现的Flash消息的条件逻辑。我做到了这一点,我可以测试看看在各种情况下会出现什么和不出现。