2014-02-12 52 views
1

我想在new.html.erb頁面中使用標題Ruby on Rails Tutorial Sample App | Foo's。我的佈局:HTML編碼/使用Rails提供的功能退出

<!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 
+0

什麼是'full_title'? – coreyward

+0

我編輯了full_title – Pierre

+0

我有一個編碼錯誤!查看描述 – Pierre

回答

1

我發現:

只需添加.html_safefull_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 
0

您使用自定義的幫手:full_title,顯示的基本名稱後跟一個|字符您提供的又是什麼。

如果你只想要你的標題,你應該做的:

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

我的意思是,我想完整的標題,但沒有''' – Pierre

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:當你添加一個字符串到SafeBuffer(通過調用+或< <),其他字符串在被附加到SafeBuffer之前被HTML轉義。將另一個SafeBuffer附加到SafeBuffer時,不會發生轉義。 Rails使用SafeBuffers渲染你的所有視圖,所以上面更新的方法最終爲Rails提供了一個SafeBuffer,我們已經控制它在page_title上「根據需要」而不是「always」執行轉義。

現在,這個答案的功勞完全歸功於Henning Koch,並在Everything you know about html_safe is wrong詳細解釋 - 我上面的回顧只是試圖提供這個鏈接永遠消亡的解釋的本質。