使用 eval 运行 ruby 代码,它的宝石,轨道



我正在使用 eval 来运行一些代码(即在数据库中,没有 ruby 文件(,但这段代码需要一些 gem。我将如何运行代码?也许有比 eval 更好的方法?

为了提供更多上下文,我在视图中有一个切换按钮,用于在模型中将布尔值切换为 true 或 false。这对于每个"代码段"都是可能的。

当它切换到 true 时,代码开始在永不停止的线程中运行,当它切换到 false 时,这会杀死线程。

我只是想让线程立即运行代码。

我对rails很陌生,所以也许有一种比像我正在做的事情那样手工做更好的方法,但是我已经尝试过谷歌搜索一些典型的线程的东西,它用于发送邮件或其他类似的东西。不适用于除非被告知永远不会停止的事情(即切换将布尔值切换为 false 的按钮(。

提前谢谢。

听起来您需要以 gem 导入为前缀的代码——这可能首先需要一个捆绑器环境来加载这些 gem。

由于代码直接存储在数据库中,因此您可以在它们前面加上另一列/常量,为您执行所有 gem 加载。

如果 gem 已通过服务器上的捆绑器安装,请尝试在代码前面加上bundle exec前缀。为此,您需要先将代码写入临时文件位置。

要安装适当的 Gem,这是构建/部署过程的一部分。

要在 rails 环境中运行脚本(这听起来像您需要的(,您可以使用rails runner. 例如:

rails runner lib/scripts/my_script_to_run.rb 

然后,此脚本将从数据库中获取所需的代码,并且已经具有正确的(rails(上下文,以便能够运行代码。

或者也许更合适:

rails runner <your-ruby-code-here> 

请参阅文档

另一种方法是查看背景工作,恕我直言,这似乎更适合这个问题。查看ActiveJob指南:http://edgeguides.rubyonrails.org/active_job_basics.html

使用后台作业的优点:

  • 这是一种行之有效的工作方式
  • 某些适配器包括额外的管理工具
  • 您不必自己管理线程
  • 有一种简洁的方法可以在代码和队列作业中描述作业
  • 使用现有概念/解决方案也更容易向其他开发人员解释

有各种各样的适配器可用,一些最简单的适配器只是将作业存储在当前数据库中。有关完整列表,请参阅 http://edgeapi.rubyonrails.org/classes/ActiveJob/QueueAdapters.html,我建议从 Que 或 DelayedJob 开始。在这种情况下,您的流程会略有变化:我会对作业进行排队,而不是循环,只要切换开关没有切换,我就会重新排队。但是,当然:我不知道您的确切用例,因此您的方法可能同样有效或更好。

最新更新