首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自控制器的闪存消息:它的html代码以文本形式显示。

来自控制器的闪存消息:它的html代码以文本形式显示。
EN

Stack Overflow用户
提问于 2015-07-24 19:09:46
回答 2查看 2K关注 0票数 3

在我的控制器中,作为create方法的一部分,我有一个闪存消息:

代码语言:javascript
复制
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 %>,问题仍然存在):

代码语言:javascript
复制
<% 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">&times;</span><span class="sr-only">Close</span></button>
  <% end -%>
<% end %>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,如

代码语言:javascript
复制
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。您可以使它更通用,并删除不必要的消息,如

代码语言:javascript
复制
before_filter -> {
  if flash[:html_safe]
    flash.delete(:html_safe)
    flash.each do |k, message| 
      flash[k] = message.try(:html_safe)
    end
  end
}
票数 4
EN

Stack Overflow用户

发布于 2015-07-24 19:45:19

希望@nextstep能读到这句话,因为他注意到了他的答案。

您需要在显示闪存消息时执行.html_safe操作,而不是在设置闪存消息时执行,因为在这些操作之间,消息将被序列化到会话中,因此将丢失html_safe标志。

我在测试中搞砸了,因为我在同一个请求中设置和显示闪存消息(因此在设置和显示之间没有序列化/反序列化)。

因此,正如@nextstep最初所说(基本上),将您的视图更改为:

代码语言:javascript
复制
<%= message.html_safe %>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31618063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档