#javascript #ruby-on-rails #ruby
#javascript #ruby-on-rails #ruby
Вопрос:
Я создал приложение Rails, которое имеет API, который возвращает объект JSON. Я хочу разрешить пользователям писать свои собственные сценарии и сохранять их. Затем эти сценарии будут выполняться, когда пользователь вызовет API для приложения, и вводятся как часть ответа.
Примером может быть, когда пользователь вызывает мой API, вызывается его javascript, и все, что возвращается из их скрипта, сохраняется в виде строки и используется одной из моих моделей и используется как часть объекта JSON — не полный ответ.
Я хочу знать, как вызвать функцию javascript из модели rails, сохранить вывод javascript в виде строки в Ruby, а затем иметь возможность обрабатывать все, что возвращается, перед отправкой ответа API.
Текущие ответы, похоже, связаны только с контроллерами и рендерингом как JS, но я хотел бы выполнить скрипт из модели.
Это должно быть что-то вроде:
string = execute_javascript("return 'hello world';")
Это больше связано с чистым Ruby, чем с Rails, поскольку я просто хочу вызвать его из стандартного класса Ruby и сохранить вывод в виде строки. Мне также нужно рассмотреть последствия этого для безопасности, но сначала хотелось бы знать, как это сделать
Ответ №1:
Самым простым решением для выполнения наиболее распространенного кода Javascript является использование ExecJS gem . Если вы используете стандартный пакет gem для Rails, то ExecJS
он уже включен Rails Coffeescript
. Короткий пример:
require "execjs"
ExecJS.eval "'red yellow blue'.split(' ')"
# => ["red", "yellow", "blue"]
Приведенное выше решение хорошо только в том случае, если вы используете прототип. В рабочей среде вы хотели бы каким-то образом запустить пользовательский код в изолированной среде и, желательно, на совершенно другом сервере. Вам также необходимо убедиться, что код не будет занимать 100% ресурсов вашего сервера во время выполнения, и просмотреть код, чтобы убедиться, что он не сделает ничего вредоносного.
Комментарии:
1. Отлично, это работает отлично. Спасибо за дополнительную информацию
Ответ №2:
Вы можете вызвать функцию javascript в вспомогательном классе, а затем включить этот помощник в свою модель, где он вам нужен.