我为一个设计用户提供了一个非常简单的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
我不确定我是否忽略了已经提供的设计。
我怎样才能更好地处理这个问题?
答案 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?
答案 1 :(得分:0)
我不确定我是否正确理解您,但只需在您的视图中放置'alert'(sign_in.html.erb),Devise就会闪烁错误消息。
<div class="alert">
<%= alert %>
</div>
答案 2 :(得分:0)
我希望能够做类似的事情,就像你在大多数Rails表单上可能有的特定于表单的错误消息一样(而不是布局范围的全局闪存)。
你可以在这个Github要点中查看我的想法:https://gist.github.com/3792471
基本上(下面的注释假设:user
的设计范围):
FailureApp
,只需添加“范围”flash
“指标”。也就是说,如果由于登录失败而导致devise + warden快速退出,因此设置flash.now[:alert]
,添加flash.now[:user] = [:alert]
FormBuilder
(实际上,SimpleForm::FormBuilder
,但应该与其他人合作)添加#flash
方法,该方法会检查范围指示符。如果找到,则从FlashHash
中提取/删除匹配并进行渲染。如果未找到(即,flash[:alert]
可能存在,也可能不存在,但flash[:user]
不存在或不包含:alert
),则不执行任何操作以使闪存仍可用于默认使用情况下。请注意,我的示例gist中的布局没有围绕布局呈现的Flash消息的条件逻辑。我做到了这一点,我可以测试看看在各种情况下会出现什么和不出现。