3

我为设计用户提供了一个非常简单的登录页面。提交不正确的数据后,日志显示“401 Unauthorized”并将我重定向回登录页面。我想不出一种向用户显示错误消息的方法。

我看了一下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

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

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

4

3 回答 3

3

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

这是设计文档中的内容:

请记住,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 - 设计 - 登录时出现错误消息?

设计错误显示两次

设计 - 自定义用户编辑页面

于 2012-05-04T12:47:56.653 回答
0

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

<div class="alert">
  <%= alert %>
</div>
于 2012-05-04T12:36:13.077 回答
0

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

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

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

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

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

于 2012-09-28T04:18:17.387 回答