设计/ Rails - 如何删除特定的Flash消息?(成功签署)

ben*_*itr 39 ruby-on-rails devise

使用Devise,我想知道是否有办法删除特定的Flash消息?(成功签署).

我关心视图中的其他消息,所以它只适用于已登录和已签名的消息.我是否必须覆盖控制器或还有其他方法?

谢谢!

shi*_*ara 59

您只需将其定义为本地文件中的空字符串即可.在这种情况下,你什么都看不到.

  • 我希望有更好的方法来做到这一点:) (4认同)
  • 这个答案是错误的(CSS仍然显示)和不完整(定义什么?在哪里?).正确答案来自benoitr. (3认同)
  • 这个文件通常位于`config/locales/devise.en.yml` (2认同)

ben*_*itr 39

好!

正如Shingara所说,我在devise.en.yml中定义了一个空字符串

sessions:
  signed_in: ''
Run Code Online (Sandbox Code Playgroud)

我也改变了以下一行(由nifty-generators提供):

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash" if msg.length > 0 %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

就这样,我的CSS没有出现.

  • 稍微整理一下,你可以将"msg.length> 0"改为"msg.present?".它会更具可读性. (8认同)

Sea*_*eld 9

语言环境文件中的空字符串(如上所述),但还要添加以下CSS代码段以隐藏(而不是使用您的Flash视图进行修改)

.flash.alert:empty {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)


Sun*_*nny 9

另一种灵活的方法是在行动后取消通知:

class SessionsController < Devise::SessionsController
  after_action :remove_notice, only: :destroy

  private

  def remove_notice
    flash[:notice] = nil
  end
end
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,您可以添加条件以删除或不通知.


and*_*ham 5

另一种方法是,如果您覆盖Devise控制器,则在create动作中放入以下代码,该代码将删除Flash消息:

class MyDevise::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
Run Code Online (Sandbox Code Playgroud)

这在另一个SO问题中得到了回答。 有关如何覆盖Devise控制器的博客文章,请参阅我的博客文章。