我构建了一个Rails应用程序,它有一个返回JSON对象的API。我想允许用户编写自己的脚本并存储它们。然后,当用户对应用程序进行API调用并作为响应的一部分进行注入时,将执行这些脚本。
一个例子是当用户调用我的API时,他们的javascript将被调用,并且从他们的脚本返回的任何内容都将保存为字符串并由我的一个模型使用并用作JSON对象的一部分 - 而不是全面回应。
我想知道如何从rails模型调用javascript函数,将javascript的输出保存为Ruby中的字符串,然后能够处理在做出API响应之前返回的任何内容。
当前的答案似乎只与控制器相关并呈现为JS,但我想从模型中执行脚本。
应该是这样的:
string = execute_javascript("return 'hello world';")
这与纯Ruby比Rails更相关,因为我只是想从标准的Ruby类中调用它并将输出保存为字符串。我还需要考虑这样做的安全隐患,但首先想知道如何做到这一点
答案 0 :(得分:1)
执行最常见的Javascript代码的最简单的解决方案是使用ExecJS gem。如果您使用的是Rails标准gem包,ExecJS
已包含Rails Coffeescript
。一个简短的例子:
require "execjs"
ExecJS.eval "'red yellow blue'.split(' ')"
# => ["red", "yellow", "blue"]
只有在运行原型时,上述解决方案才有用。在生产中,您可能希望以某种方式在沙箱中运行用户代码,最好是在整个不同的服务器上运行。您还需要确保代码在执行和筛选代码时不会占用服务器的100%资源,以确保它不会做任何恶意操作。
答案 1 :(得分:0)
您可以在Helper类中调用javascript函数,然后在您需要的模型中包含该帮助程序。