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

时间:2010-11-04 14:55:58

标签: ruby-on-rails devise

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

我关心视图中的其他消息,所以它只适用于已登录和已注销的消息。 我是否必须覆盖控制器或有另一种方式?

谢谢!

8 个答案:

答案 0 :(得分:59)

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

答案 1 :(得分:39)

确定!

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

sessions:
  signed_in: ''

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

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash" if msg.length > 0 %>
<% end %>

这样,我的css就不会出现了。

答案 2 :(得分:8)

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

.flash.alert:empty {
  display: none;
}

答案 3 :(得分:8)

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

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

  private

  def remove_notice
    flash[:notice] = nil
  end
end

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

答案 4 :(得分:4)

另一种方法是,如果你覆盖Devise控制器,在create action中输入这段代码,删除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

this was answered in this other SO question. 有关如何覆盖Devise控制器的博客文章,请参阅my blog post

答案 5 :(得分:3)

从我的角度来看,当你可以轻松修改控制器的工作方式时,我没有看到清空字符串翻译的重点。 我想这种方式更加正确和令人满意。

更好的答案可能是在sessionController中覆盖destroy方法。

只需创建一个放在以下位置的文件:app / controllers / sessions_controller.rb

如您所见,我们会评论创建Flash消息的行。

class SessionsController < Devise::SessionsController 
  # DELETE /resource/sign_out
  def destroy
    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    #set_flash_message :notice, :signed_out if signed_out && is_flashing_format?
    yield if block_given?
    respond_to_on_destroy
  end
end

答案 6 :(得分:2)

我认为设计现在明白,如果将config/locals/devise.en.yml中的错误消息更改为空字符串,它将自动忽略它。至少那些对我有用的东西。

答案 7 :(得分:0)

您可以这样做,请相应地更改条件类型和闪光类型。

flash.delete(:alert)if flash [:alert] ==“您需要先登录或注册才能继续。”     @drivers = params [:keyword] .blank? ? []:Driver.find(params [:keyword])

你可以在过滤之前完成。