使用Devise,我想知道是否有办法删除特定的Flash消息? (成功签署)。
我关心视图中的其他消息,所以它只适用于已登录和已注销的消息。 我是否必须覆盖控制器或有另一种方式?
谢谢!
答案 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])
你可以在过滤之前完成。