在我的控制器中,作为create方法的一部分,我有一个闪存消息:
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,但还是出现了这种情况。有人知道是什么导致了这一切吗?该怎么办?
更新:--我也在其他控制器闪存消息中尝试过。只是添加了<br>和html_safe,看看它将如何显示,每次都会导致问题。在查看页面时,它不会产生任何问题。
根据请求,显示闪存消息的代码(但即使我将其简化为<%= 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 %>发布于 2015-07-24 19:52:05
<%= message.html_safe %>
这将悄悄地将所有通知直接放到html中,因此您的并不是真正想要这样做的。你可以这样做,只有当你100%肯定你的应用从来没有把任何用户的内容在通知中,否则你的应用程序将容易受到js注入攻击。相反,试着:
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安全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
}发布于 2015-07-24 19:45:19
希望@nextstep能读到这句话,因为他注意到了他的答案。
您需要在显示闪存消息时执行.html_safe操作,而不是在设置闪存消息时执行,因为在这些操作之间,消息将被序列化到会话中,因此将丢失html_safe标志。
我在测试中搞砸了,因为我在同一个请求中设置和显示闪存消息(因此在设置和显示之间没有序列化/反序列化)。
因此,正如@nextstep最初所说(基本上),将您的视图更改为:
<%= message.html_safe %>https://stackoverflow.com/questions/31618063
复制相似问题