0

我有一個標籤標籤,其內容是從en.yml文件加載的。Rails轉義標籤標籤內的字符串

html.erb

<%=label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person))).html_safe%> 

PERSON_NAME是一個輔助並輸出來自輔助

persons_helper.rb

def person_name(person) 
    content_tag(:span, 
       formatted_name(person.name) || t("helpers.persons.default_name"), 
       class: 'name').html_safe 
end 

輸出串上噸方法傳遞的字符串並連接如下

en.yml

name: "Person Name: (%{name})" 

我要輸出到像

<label for="person"> 
    Person Name: 
    <span class='name> John Doe </span> 
</label> 

而是我得到

<label for="person"> 
    Person Name:(&lt;span class="name"&gt;John Doe&lt;/span&gt;) 
</label> 

我明白,這得到了與html_safe做,原始的和逃避的字符串,但我無法讓它工作!

謝謝!

回答

0

調用.html_safe關於label_tag中的方法調用。 E.g:

<%=label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person).html_safe))%> 
0

看來,I18n.t方法不返回SafeBuffer(即一個html_safe字符串)。所以你應該在這個方法的輸出上調用.html_safe

<%= label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person)).html_safe) %> 

注意.html_safe呼叫已在一個括號被移動從那裏您有它。通過使用label_tag幫助程序的塊形式,也可以輕鬆查看。

<%= label_tag(:name) { t("helpers.form.name", name: person_name(person)).html_safe } %> 

注:我也切換到在這個例子中選擇翻譯的I18n進一步增加可讀性的"helpers.form.name"方法(但是這可能只是個人喜好 - 所以使用原來的風格,如果你喜歡!)。

最後,出於安全目的 - 使用戶名不經轉義來 - 你應該從你person_name幫手刪除.html_safe,並添加了嚴格的html_escape(或sanitize),使得它看起來像這樣:

def person_name(person) 
    content_tag(:span, 
    h(formatted_name(person.name)) || t("helpers.persons.default_name"), 
    class: 'name') 
end 

在這種形式下,content_tag將確保一切都是html_safe除了內容。這意味着person.name將按原樣通過,並根據需要進行轉義。但是,如果formatted_name方法返回已經轉義的名稱或html_safe名稱,則不需要。基本上問題是,當你不知道它們是否包含腳本標籤或什麼時,它們不會盲目地將字符串標記爲html_safe,因爲它們來自用戶輸入的值。希望這不會混淆。:)通常,只有當你100%確定它們實際上總是安全時(即它們來自系統內部而不是來自任何類型的用戶輸入),纔將其標記爲html_safe