Rails禁用设计Flash消息

如何禁用所有Devise gem flash消息(“成功登录”,“您注销”)? 谢谢。

Marat_Galiev asked 2020-07-06T13:25:25Z
6个解决方案
70 votes

可能最简单的方法是

  1. 将每条消息定义为空白字符串
  2. 在显示即显消息之前,请检查字符串的长度。

在您的devise.en.yml文件中,将每条消息指定为空:

en:
  errors:
    messages:
      not_found: ''
      already_confirmed: ''
      not_locked: ''

下一步,在布局中,在输出空白字符串之前,请检查它们。

<% flash.each do |key, value| %>
  <%= content_tag :div, value, :class => "flash #{key}" unless value.blank? %>
<% end %>
Michelle Tilley answered 2020-07-06T13:25:58Z
34 votes

一个更适合我的答案是像这样重写Devise Session Controller

class SessionsController < Devise::SessionsController

  # POST /resource/sign_in
  def create
    super
    flash.delete(:notice)
  end

  # DELETE /resource/sign_out
  def destroy
    super
    flash.delete(:notice)
  end

end

这将安全地覆盖创建和销毁方法,以删除闪存消息

acrogenesis answered 2020-07-06T13:26:26Z
5 votes

我已经能够通过覆盖is_flashing_format?在给定的控制器中禁用它们:

def is_flashing_format?
  false
end

我正在使用Devise 3.5.6

Manuel Pedrera answered 2020-07-06T13:26:50Z
3 votes

这项工作对我来说:

# app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  after_action :remove_notice, only: [:destroy, :create]

  private

  def remove_notice
    flash.discard(:notice) #http://api.rubyonrails.org/v5.1/classes/ActionDispatch/Flash/FlashHash.html#method-i-discard
  end
end

# add this line in 'config/routes.rb'
devise_for :users, :controllers => { sessions: 'users/sessions' }

我使用flash.discard(:notice),但是您可以使用flash.discard,在此示例中,我只有一个设计模型。

我使用flash.discard(:notice),但是您可以使用flash.discard同时删除其他类型。 (从Rails 3.0开始存在方法丢弃)

我更喜欢这种方法,因为查看Flash消息是否为空白不是视图的角色。 如果您有即时消息,请打印! 如果您不想要,请不要创建即时消息;-)

djothefou answered 2020-07-06T13:27:24Z
1 votes

对于Rails 5.0.6,此代码将起作用。

app/controllers/sessions_controller.rb

class SessionsController < Devise::SessionsController

  def new
    flash.clear
    super
  end
end

不要忘记路线。

devise_for :users, controllers: { sessions: 'sessions' }

devise_for :users, controllers: { sessions: 'sessions' }

zhisme answered 2020-07-06T13:27:48Z
-4 votes

Devise包含一个方便的生成器,用于将所有视图复制到您的项目中:

rails generate devise:views

这样,您可以自己编辑视图并确定要保留或丢弃的内容(即显信息)。

Tony Daly answered 2020-07-06T13:28:13Z
translate from https://stackoverflow.com:/questions/5762798/rails-disable-devise-flash-messages