我试图根据用户会话登录成功或失败生成不同的Flash消息。 (主要是通过更改jped图像)
我有一个局部视图来处理Flash消息并检查密钥,然后显示其他图像:
_flash_message.html.erb
<% if flash.present? %>
<% case flash.first[0] %>
<% when "devise_deconnexion" %>
<div id="flash-message">
<div id="image">
<%= image_tag "deconnecte.svg" %>
</div>
<div id="affiche">
<div id="message">
<h1>Succès</h1>
<h2><%= flash.first[1] %></h2>
</div>
<div id="check" style="background-color: #00e691;">
<%= image_tag "check_blanc.svg" %>
</div>
</div>
</div>
...
在上面的位中,我检查键是否匹配“ devise_deconnexion”字符串,以便在Flash消息中显示其他图像。
我已经能够通过为每个Devise模型生成devise会话控制器并进行如下更改来进行调整:
sessions_controller.rb
def destroy
# super
signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
set_flash_message! :devise_deconnexion, :signed_out if signed_out
yield if block_given?
respond_to_on_destroy
end
效果很好。
尽管在用户输入错误密码的情况下,我很难更改图像。我不知道在哪里可以修改Flash键。
这是来自github的Devise会话#create代码:
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
我只看到:notice
消息与:signed_in
一起使用。
我看不到触发了“密码或用户名错误”提示消息的位置(尽管输入密码错误我确实会收到提示信息)
答案 0 :(得分:1)
当用户输入错误的密码时,控制器中的代码执行将在此行停止:
self.resource = warden.authenticate!(auth_options)
之后,失败的请求由所谓的“ Devise失败应用程序”处理。
https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb
您可以使用自己的自定义替换失败应用程序。
1)创建自定义失败应用:
class CustomFailureApp < Devise::FailureApp
# your custom code goes here ....
end
2)告诉Devise使用您的自定义失败应用
# initializers/devise.rb
Devise.setup do |config|
config.warden do |manager|
manager.failure_app = CustomFailureApp
end
end
如何定制Devise's Failure应用程序以实现您的目标。祝你好运!