【问题标题】:Customizing flash messages per success/failure for Devise为 Devise 自定义每次成功/失败的 Flash 消息
【发布时间】:2019-09-19 02:39:54
【问题描述】:

我正在尝试根据用户会话成功或登录失败生成不同外观的 Flash 消息。 (主要是通过改变jped图像)

我有一个部分视图处理闪存消息并检查密钥,然后显示不同的图像:

_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>

...

在上面的位中,我检查 key 是否匹配“devise_deconnexion”字符串,以便在 flash 消息中显示不同的图像。

我已经能够通过为每个设计模型生成设计会话控制器并按以下方式进行更改来调整这一点:

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

效果很好。

虽然我很难在用户输入错误密码的情况下更改图像。我不知道在哪里修改闪存键。

这是从 github 获取的设计会话#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

我只看到与:signed_in 消息一起使用的:notice 键。

我看不到“错误密码或用户名”的闪烁消息是在哪里触发的(尽管输入错误密码时我确实收到了一条闪烁消息)

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    当用户输入错误密码时,控制器中的代码执行将在此行停止:

    self.resource = warden.authenticate!(auth_options)
    

    之后,失败的请求由所谓的“设计失败应用程序”处理。

    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 应用程序以实现您的目标是您自己想办法。祝你好运!

    【讨论】:

    • 非常感谢。我将覆盖涉及闪存消息的方法。您是否建议将自定义故障应用程序存储在 /lib 文件夹中?
    • 有什么方法可以打印从 FailureApp 调用的 fail!('My message') 发送的消息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多