1

我的项目中有一个这样的控制器:

class BriefcasesController < ApplicationController
  ...

  def update
    @super_power = SuperPower.find(params[:super_power_id])
    @briefcase.contents.delete(params[:super_power_id].to_s)
    flash[:notice] = "Successfully removed #{view_context.link_to(@super_power.title, super_power_path(@super_power)} from your briefcase."
    redirect_back(fallback_location: '/briefcase'
  end

end

帮助程序没有呈现到浏览器的link_to链接,而是打印 html:Successfully removed <a href=\"/powers/1\>flying</a> from your briefcase.我也尝试过使用#html_safeflash 消息上的方法,但无济于事。我想知道是否有解决此问题的方法,view_context或者是否有更好的方法在 Flash 消息中包含链接。

4

2 回答 2

3

您需要html_safe在输出闪存消息时使用 - 而不是在存储它们时使用。

<% flash.each do |key, msg| -%>
  <%= content_tag :div, msg.html_safe, class: name %>
<% end -%>

.html_safe只需在其信任且不应转义的字符串对象上设置一个标志。

flash 通过在会话存储中存储 flash 消息来工作 -默认情况下,这意味着浏览器中的 cookie

所以当你这样做时:

flash[:notice] = "foo"

您将原始字符串“foo”存储在 cookie* 中,并在下一个请求时将其解压缩回会话中。但是字符串不是同一个 Ruby 对象——所以html_safe字符串对象上的标志不是持久的。

于 2017-04-12T00:39:24.693 回答
1

注意:以下内容仅适用于相对较旧的 Rails 版本(在 4.0 及之前版本中确认,可能在 4.1 中确认)。Rails 过去允许自定义对象在 flash 消息中传递,但后来将其更改为仅允许原始对象(记录在https://github.com/rails/rails/issues/15522)。

您需要调用html_safe整个字符串。使用字符串插值 ( "#{some_ruby_code}") 将“安全”link_to字符串改回一个可以转义的常规字符串。

于 2017-04-12T00:36:14.523 回答