将variables值注入到RoR中的javascript和HAML中

我有以下使用ZenDesk的function。 我想注入我的current_user的细节如下表格。 (这是我从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 }); } 

简而言之,如何将一个railsvariables注入到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 #{}适用于简单的string,但通常不是最具可扩展性/安全性的解决scheme。

例如,Ruby中的文字反斜杠会导致Javascript中的问题,在这里它将被解释为一个换行符:

 - a = "\\n" :javascript '#{ a }' !== "\\n" 

从这个令人敬畏的Rails演员 ,可以使用以下技术:

escape_javascript

别名: j

仅适用于string。

将可以在Javascriptstring中具有特殊含义的字符(如反斜杠转义符)转义为适合放入JavaScriptstring引号的格式。

保持input的html_safe状态,所以需要html_safe否则就需要特殊的HTML字符<会被转换成&lt;

 - a = "\\n<" :javascript '#{ j(a) }' === '\\n&lt;' '#{ j(a).html_safe }' === '\\n<' 

to_json + html_safe

因为JSON 几乎是Javascript对象文字符号的一个子集 。

适用于任何散列对象,包括转换为相应数据types的JSON片段的string,数组和整数。

 - data = { key1: 'val1', key2: 'val2' } :javascript data = #{ data.to_json } data.key1 === 'val1' data.key2 === 'val2' 

数据属性

为属性添加值,使用Javascript DOM操作检索它们。

content_tag帮手更好:

 = content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} :javascript $('#data').data('key1') === 'val1' $('#data').data('key2') === 'val2' 

专门为此工作的图书馆: https : //github.com/gazay/gon

可能是最强大的解决scheme。

的Gemfile:

 gem 'gon' 

控制器:

 gon.key1 = 'val1' gon.key2 = 'val2' 

Layout app/views/layouts/application.html.erb

 <html> <head> <meta charset="utf-8"/> <%= include_gon %> 

视图:

 :javascript gon.key1 === 'val1' gon.key2 === 'val2'