Ruby on rails 在登录过程中优雅地处理设备401

Ruby on rails 在登录过程中优雅地处理设备401,ruby-on-rails,devise,Ruby On Rails,Devise,我有一个非常简单的登录页面供Desive用户使用。提交错误数据时,日志显示“401未经授权”,并将我重定向回登录页面。我想不出向用户显示错误消息的方法 我查看了design::sessions\u controller#create,如下所示 # POST /resource/sign_in def create resource = warden.authenticate!(auth_options) set_flash_message(:notice, :signed

我有一个非常简单的登录页面供Desive用户使用。提交错误数据时,日志显示“401未经授权”,并将我重定向回登录页面。我想不出向用户显示错误消息的方法

我查看了
design::sessions\u 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
处中断,用户会被重定向到“新建”页面,即登录页面

我只需要向用户显示一条无效的\u凭证工具提示/flash\u消息。因此,我通过修改
:recall=>“#{controller\u path}#handle\u create\u fail”(查看
auth\u options
),在身份验证失败时调用handle\u create\u fails
,在其中设置错误消息

我不确定我是否忽略了Desive已经提供的东西


如何更好地处理此问题?

我不确定是否正确理解您的意思,但只要在您的视图(sign_in.html.erb)中放置“alert”,Desive就会闪现错误消息

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

“设计”将错误消息存储在rails“flash”中,使用
flash[:注意]
查看成功消息,使用
flash[:警报]
查看问题

以下是来自:

记住,如果用户登录,Desive会使用flash消息让用户知道 是成功还是失败。Desive希望您的应用程序调用 “闪光[:注意]”和“闪光[:提醒]”视情况而定

这意味着在视图文件(或更一般地在应用程序布局文件中)中,应该包含类似于以下几行的内容:

<%= 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表单上一样,按照特定于表单的错误消息传递路线执行类似的操作(而不是布局广泛的全局闪存)

你可以看看我在Github的要点中提出了什么:

基本上(以下注释假设设计范围为
:user
):

  • 添加/使用Deviate+warden使用的自定义
    FailureApp
    ,只需添加一个“范围”
    闪存
    “指示器”。也就是说,如果Deviate+warden由于登录失败而快速退出,因此设置了
    flash.now[:alert]
    ,则添加
    flash.now[:user]=[:alert]
  • 扩展
    FormBuilder
    (实际上,在我的要点中是
    SimpleForm::FormBuilder
    ,但应该与其他人一起使用)以添加
    #flash
    方法,该方法检查范围指示器。如果找到匹配项,将从
    FlashHash
    中提取/删除匹配项并进行渲染。如果找不到(即,
    flash[:alert]
    可能存在,也可能不存在,但
    flash[:user]
    不存在或不包含
    :alert
    ),请不要执行任何操作,以使flash在默认用例中保持可用
  • 将渲染添加到相关视图/布局
请注意,我的示例gist中的布局在布局呈现的flash消息周围没有条件逻辑。我这样做只是为了测试,看看在不同的情况下什么会出现,什么不会出现