【发布时间】:2021-01-17 08:06:19
【问题描述】:
我在 Ruby on Rails 应用程序的子目录中有一个 Ruby 脚本,该应用程序在后台运行并执行一些支持任务。在这个脚本中,想访问 Rails 环境和应用程序控制器常量的值。
目前我能找到的检索这些值的最佳方法是基于 Rails runner。如果我跑
cd .. && Rails runner "puts [Rails.env, ApplicationController::CONSTANT_NAME]"
从 shell 的子目录中,我得到了所需的值。但是当我尝试在我的脚本中使用相同的命令时,我得到一个未定义的 active_storage 方法错误:
/home/user/.rvm/gems/ruby-2.6.5/gems/railties-6.0.3.2/lib/rails/railtie/configuration.rb:96:in `method_missing': undefined method `active_storage' for #<Rails::Application::Configuration:0x0000563603fbdaa8> (NoMethodError)
脚本中的代码是
puts %x|cd .. && rails runner "puts [Rails.env, ApplicationController::CONSTANT_NAME]"|
Rails 应用程序和 Ruby 脚本在同一用户下运行。我有 Rails 6.0.3.2 和 Ruby 2.6.5。
【问题讨论】:
-
FWIW,您的代码在
lib(Rails 6)的 ruby 脚本中运行良好。我看不到加载整个 Rails 环境的价值,然后将其丢弃为单个命令。你不能只通过rails runner运行整个脚本吗? -
感谢您的反馈。是的,我同意存在一定的开销,并且可以选择通过
Rails runner运行整个脚本。就我而言,开销并不是很重要,因为我在启动时只需要一次这个命令。我可以确认该命令在 lib/assets 中有效。我会尝试移动我的脚本。 -
我找到了错误信息的原因。该脚本有自己的 Gemfile 并包含
require "bundler/setup"。这会清理加载路径并在从脚本中调用 Rails 运行器或 Rake 任务时导致错误。我将修改脚本以更好地与 Rails 集成。感谢 cmets 和答案。
标签: ruby-on-rails ruby runner