2011-01-16 19 views
45

У меня есть следующая функция для использования ZenDesk. Я хотел бы добавить мои данные current_user в форму следующим образом. (это мой шаблон html.haml). Однако я не могу понять, как это сделать.Ввод значений переменных в javascript и HAML в RoR

: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 
     }); 
    } 

Вкратце, как один из них вводит переменные переменных в элемент: javascript в haml.

+0

Ответы будут одинаковыми без HAML: http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view –

ответ

54

Это должно работать, т.е. положить все встроенный рубин внутри #{}:

requester_name: "#{current_user.first_name + ' ' + current_user.last_name if current_user}", 
requester_email: "#{current_user.email if current_user}", 
+0

А как насчет обратного направления? то есть : javascript # {raw some_helper (ARGUMENTS FROM JS ЗДЕСЬ)} – januszm

+0

Javascript запускается в браузере и рубине на сервере, поэтому вы не можете этого сделать. – Heikki

20

Прямые #{} работает для простых строк, но это не самый масштабируемый/безопасное решение в целом.

Например, буквальный символ обратной косой черты в Рубине бы вызвать проблемы в JavaScript, где он будет интерпретироваться как символ новой строки:

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

Из this awesome Rails cast, могут быть использованы следующие методы:

escape_javascript

Псевдоним: j.

Работы только на струнах.

Исключает символы, которые могут иметь специальные значения в строках Javascript, , как обратная косая черта, в формат, подходящий для ввода буквенных котировок Javascript.

Поддерживать html_safe статус входа, поэтому необходимо html_safe иначе специальные HTML символы, такие как < бы получить убежали в &lt;.

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

to_json + html_safe

работает, потому что JSON является almost a subset of Javascript object literal notation.

Работает с любым хеш-объектом, включая строки, массивы и целые числа, которые являются , преобразованные в фрагменты JSON соответствующего типа данных.

- 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

Вероятно, наиболее надежным решением.

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' 
+2

Downvoters, пожалуйста, объясните, чтобы я мог улучшить информацию. Я никогда не отвечаю. Благодарю. –

Смежные вопросы