2016-10-05 4 views
1

Я создал приложение Rails, которое имеет API, который возвращает объект JSON. Я хочу, чтобы пользователи могли писать свои собственные скрипты и хранить их. Затем эти скрипты будут выполняться, когда пользователь сделает вызов API в приложение и будет вложен как часть ответа.Вызов функции JavaScript из модели Ruby on Rails

Примером может служить пользователь, вызывающий мой API, его javascript будет вызываться и все, что возвращается из их сценария, будет сохранено в виде строки и использовано одной из моих моделей и будет использоваться как часть объекта JSON - не полный ответ.

Я хочу знать, как вызвать функцию javascript из модели рельсов, сохранить вывод javascript в виде строки в Ruby и затем обработать все, что возвращается, прежде чем отвечать на API.

Текущие ответы, похоже, связаны только с контроллерами и рендерингом как JS, но я хотел бы выполнить сценарий из модели.

Это должно быть что-то вроде:

string = execute_javascript("return 'hello world';") 

Это больше связано с чистым Ruby, чем Rails, как я просто хотел назвать его из стандартного класса Ruby, и сохранить результат в виде строки. Мне также нужно учитывать последствия для безопасности, связанные с этим, но сначала хотелось бы знать, как это сделать.

ответ

1

Простейшее решение для выполнения наиболее распространенного кода Javascript использует драгоценный камень ExecJS. Если вы используете стандартный комплект Gem Rails, тогда ExecJS уже включен в комплект Rails Coffeescript. Короткий пример:

require "execjs" 
ExecJS.eval "'red yellow blue'.split(' ')" 
# => ["red", "yellow", "blue"] 

Данное решение подходит только в том случае, если вы используете прототип. В производстве вы хотели бы каким-то образом запустить код пользователя в песочнице и, желательно, на целом другом сервере. Вам также необходимо убедиться, что код не займет 100% ресурса вашего сервера во время выполнения и просмотра кода, чтобы убедиться, что он не сделает ничего злонамеренного.

+0

Отлично работает. Спасибо за дополнительную информацию – pronoob

0

Вы можете вызвать функцию javascript в классе Helper, а затем включить этот помощник в свою модель, где она вам нужна.