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

时间:2014-02-12 17:45:22

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

我希望在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>

但我的头衔错了:

enter image description here

我该怎么做?

-

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

3 个答案:

答案 0 :(得分:2)

我遇到了同样的事情,发现了比使用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,但如果它是安全的则不会转义。

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

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

现在,这个答案的功劳完全归功于Henning Koch,并且在Everything you know about html_safe is wrong更详细地解释了 - 我的上述回顾只是试图提供解释的本质,因为这个链接曾经模具

答案 1 :(得分:1)

我找到了:

只需在我的.html_safe功能

中添加full_title即可

模块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

答案 2 :(得分:0)

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

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

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