0

en.yml ファイルからコンテンツが読み込まれる label タグがあります。

html.erb

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

person_name はヘルパーで、文字列を出力します

person_helper.rb

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

ヘルパーからの出力文字列は t メソッドに渡され、次のように連結されます

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、raw、およびエスケープ文字列に関係していることは理解していますが、機能させることができませんでした!

ありがとう!

4

3 に答える 3

0

メソッドが SafeBuffer (つまりI18n.t、html_safe 文字列) を返していないようです。.html_safeしたがって、このメソッドからの出力を呼び出す必要があります。

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

.html_safe呼び出しは、元の場所から 1 つの括弧内に移動されていることに注意してください。label_tagこれは、ヘルパーのブロック形式を使用することで、わずかに見やすくすることもできます。

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

注: この例では、さらに読みやすくするために I18n 翻訳を選択する方法にも切り替えました"helpers.form.name"(ただし、これは個人的な好みにすぎない可能性があります。必要に応じて元のスタイルを使用してください!)。

最後に、セキュリティ上の理由から (エスケープされていないユーザー名が表示されないようにするため)、ヘルパー.html_safeからを削除しperson_name、strict 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基本的に重要なのは、文字列にスクリプト タグが含まれているかどうかなどがわからないため、文字列がユーザー入力値に由来するものであるとやみくもにマークしたくないということです。うまくいけば、これは混乱しませんでした。:) 一般に、文字列html_safeが実際に常に安全であることが 100% 確実である場合にのみ、文字列をマークします (つまり、文字列はシステム内からのものであり、ユーザー入力からのものではありません)。

于 2014-06-10T16:35:44.140 に答える
0

.html_safelabel_tag 内のメソッド呼び出しで呼び出します。例えば:

<%=label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person).html_safe))%>
于 2014-06-10T15:10:51.680 に答える