繁体   English   中英

带有Rails的HTML编码/转义功能

[英]HTML encode/escape with Rails with provide function

我想拥有Ruby on Rails Tutorial Sample App | Foo's的标题 Ruby on Rails Tutorial Sample App | Foo's在我的new.html.erb页面中。 我的布局是:

<!DOCTYPE html>
<html>
<head>
    <title><%= full_title(yield(:title)) %></title>  
    <%= stylesheet_link_tag "application", media: "all", 
    "data-turbolinks-track" => true %>
    <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
    <%= csrf_meta_tags %>
</head>
<body>
    <%= render 'layouts/header' %>
    <div class="container">
        <%= yield %>
    </div>
</body>

我的new.html.erb

<% provide(:title, "Foo's") %>
<h1>Sign up</h1>
<p>Find me in app/views/users/new.html.erb</p>

但我的头衔错了:

在此输入图像描述

我该怎么做 ?

-

Full_title

module ApplicationHelper

  # Returns the full title on a per-page basis.
  def full_title(page_title)
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      "#{base_title} | #{page_title}"
    end
  end
end

我遇到了同样的事情并发现了比使用html_safe更安全的解决方案。

一,方法:

def full_title(page_title)
  base_title = "".html_safe
  base_title << "Ruby on Rails Tutorial Sample App"
  if page_title.present?
    base_title << " | "
    base_title << page_title
  end
  base_title
end

如果它不安全,则会转义page_title ,但如果它是安全的,则将其page_title为未转义状态。

这允许"Foo's"正确显示,但也可以转义"<script>alert('foo')</script>" - 例如,如果某些恶意用户设法将自定义文本输入到标题中显示的字段中标签,或者如果您不小心自己使用有风险的文本。

解释归结为这个 - 'foo'.html_safe返回一个ActiveSupport :: SafeBuffer,除了一个外,它在各种方面都像String一样:当你将一个String附加到一个SafeBuffer(通过调用+或<<)时,那个其他字符串在将其附加到SafeBuffer之前进行HTML转义。 当您将另一个SafeBuffer附加到SafeBuffer时,不会发生转义。 Rails使用SafeBuffers渲染你的所有视图,因此上面更新的方法最终为Rails提供了一个SafeBuffer,我们已经控制它来“按需”而不是“总是”在page_title上执行转义。

现在,这个答案的功劳完全归功于Henning Koch,并且更详细地解释了你所知道的关于html_safe错误的所有内容 - 我的上述回顾只是试图在这个链接死亡的情况下提供解释的本质。

我已经发现 :

只需在我的full_title函数中添加.html_safe

模块ApplicationHelper

  # Returns the full title on a per-page basis.
  def full_title(page_title)
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      "#{base_title} | #{page_title}".html_safe
    end
  end
end

您正在使用自定义帮助程序: full_title ,它显示一个基本名称,后跟一个| 然后你提供什么字符。

如果你只想要你的头衔,你应该这样做:

 <title><%= yield(:title) %></title>  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM