Вызов функции JavaScript из модели Ruby on Rails

#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 в вспомогательном классе, а затем включить этот помощник в свою модель, где он вам нужен.