ZenDeskを使用するための次の機能があります。次のように、current_userの詳細をフォームに挿入したいと思います。 (これは私のfrom html.hamlテンプレートです)。しかし、私はこの仕事をする方法を理解できません。
:javascript
if (typeof(Zenbox) !== "undefined") {
Zenbox.init({
dropboxID: "xxxxx",
url: "xxxxx.zendesk.com",
tabID: "support",
tabColor: "black",
tabPosition: "Left",
requester_name: =current_user ? "#{current_user.first_name} #{current_user.last_name}" : "" ,
requester_email: =current_user ? "#{current_user.email}" : "" ,
hide_tab: true
});
}
つまり、Rails変数をhamlの:javascript要素にどのように挿入しますか。
これは機能するはずです。すべてのインラインRubyを#{}
の内側に配置:
requester_name: "#{current_user.first_name + ' ' + current_user.last_name if current_user}",
requester_email: "#{current_user.email if current_user}",
Direct #{}
は単純な文字列に対して機能しますが、一般的に最もスケーラブルで安全なソリューションではありません。
たとえば、Rubyのリテラルバックスラッシュは、改行文字として解釈されるJavascriptで問題を引き起こします。
- a = "\\n"
:javascript
'#{ a }' !== "\\n"
this awesome Rails cast から、次の手法を使用できます。
escape_javascript
エイリアス:j
。
文字列でのみ機能します。
バックスラッシュエスケープなど、Javascript文字列で特別な意味を持つ可能性のある文字を、Javascript文字列リテラル引用符内に入れるのに適した形式にエスケープします。
入力のhtml_safe
ステータスを維持するため、html_safe
が必要です。そうしないと、<
などの特別なHTML文字が<
にエスケープされます。
- a = "\\n<"
:javascript
'#{ j(a) }' === '\\n<'
'#{ j(a).html_safe }' === '\\n<'
to_json + html_safe
JSONは ほぼJavaScriptオブジェクトリテラル表記のサブセット であるため機能します。
対応するデータ型のJSONフラグメントに変換される文字列、配列、整数など、任意のハッシュオブジェクトで動作します。
- data = { key1: 'val1', key2: 'val2' }
:javascript
data = #{ data.to_json }
data.key1 === 'val1'
data.key2 === 'val2'
data- attributes
属性に値を追加し、Javascript DOM操作でそれらを取得します。
content_tag
ヘルパーの方が良い:
= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'}
:javascript
$('#data').data('key1') === 'val1'
$('#data').data('key2') === 'val2'
gon
ジョブに特化したライブラリ: https://github.com/gazay/gon
おそらく最も堅牢なソリューション。
Gemfile:
gem 'gon'
コントローラ:
gon.key1 = 'val1'
gon.key2 = 'val2'
レイアウトapp/views/layouts/application.html.erb
:
<html>
<head>
<meta charset="utf-8"/>
<%= include_gon %>
表示:
:javascript
gon.key1 === 'val1'
gon.key2 === 'val2'