我正在使用 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 开始。在这种情况下,您的流程会略有变化:我会对作业进行排队,而不是循环,只要切换开关没有切换,我就会重新排队。但是,当然:我不知道您的确切用例,因此您的方法可能同样有效或更好。