在我的控制器中,作为create
方法的一部分,我有一条flash消息:
flash[:success] = "An email was sent to #{@user.email}. Please check your inbox. <br> If you find this email in your junk mail folder, please mark the email as 'Not Junk'.".html_safe
然而,中间的<br>
显示为文本,而不是将其作为html代码处理,并在新行上继续显示文本。尽管最后使用了html_safe
。有谁知道是什么原因造成这种情况以及如何处理它?</ p>
更新:我也在其他控制器Flash消息中尝试过。只需添加<br>
和html_safe
即可查看其显示方式以及每次出现问题时的显示方式。在视图页面中,它不会产生任何问题。
根据请求显示Flash消息的代码(但即使我将其减少到<%= message %>
,问题仍然存在):
<% flash.each do |message_type, message| %>
<%= content_tag :div, class: "alert alert-#{message_type}" do -%>
<%= message %>
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<% end -%>
<% end %>
答案 0 :(得分:4)
<%= message.html_safe %>
这将默默地将所有通知直接放入html中,因此不真的想要这样做。只有当您100%确定您的应用程序永远不会将任何用户内容放入通知中,或者您的应用程序易受js注入攻击时,您才能执行此操作。而是尝试:
Flash message with html_safe from the controller in Rails 4 (safe version)
所以,是的,将before_filter -> { flash.now[:success] = flash[:success].html_safe if flash[:html_safe] && flash[:success] }
添加到您的ApplicationController中,而且每次设置html safe flash[:success]
时也将flash[:html_safe]
设置为true,例如
flash[:success] = "An email was sent to #{@user.email}. Please check your inbox. <br> If you find this email in your junk mail folder, please mark the email as 'Not Junk'.".html_safe
flash[:html_safe] = true
编辑:是的,你可以在最后跳过.html_safe。您可以使其更通用并删除不必要的消息,如
before_filter -> {
if flash[:html_safe]
flash.delete(:html_safe)
flash.each do |k, message|
flash[k] = message.try(:html_safe)
end
end
}
答案 1 :(得分:1)
希望@nextstep读到这个并取消他的答案,因为他是现场。
您需要在显示Flash消息时执行.html_safe
,而不是在设置它们时,因为在这些消息之间会将消息序列化到会话中,因此会丢失html_safe
标志
我搞砸了我的测试,因为我在同一个请求中设置并显示flash消息(因此在设置和显示之间没有被序列化/反序列化)。
因此,正如@nextstep最初所说的那样(基本上),将您的视图更改为:
<%= message.html_safe %>