来自控制器的Flash消息:其html代码显示为文本

时间:2015-07-24 19:09:47

标签: html ruby-on-rails ruby ruby-on-rails-4

在我的控制器中,作为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">&times;</span><span class="sr-only">Close</span></button>
  <% end -%>
<% end %>

2 个答案:

答案 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 %>