【问题标题】:Pass ruby script file to rails console将 ruby​​ 脚本文件传递给 rails 控制台
【发布时间】:2012-05-05 23:47:11
【问题描述】:

有没有办法将 ruby​​ 文件 foo.rb 传递到 rails 控制台。预期结果将在控制台启动 rails 环境以运行文件之后。

或任何其他允许我在 rails 环境中执行文件的方式,从命令提示符触发。

【问题讨论】:

标签: ruby ruby-on-rails-3


【解决方案1】:

你可以使用

bundle exec rails runner "eval(File.read 'your_script.rb')"

更新:

我们最近也经常使用的是从脚本本身加载 rails 环境。考虑doit.rb

#!/usr/bin/env ruby

require "/path/to/rails_app/config/environment"

# ... do your stuff

如果脚本或当前工作目录不在 rails 应用的目录中,这也有效。

【讨论】:

  • 非常感谢您的帮助!我正在使用 Sublime Text 2,所以现在我将能够触发 Rails 类的构建并直接在 IDE 中查看输出:)
  • script/runner "eval(File.read 'your_script.rb')" for rails 2.3 :)
  • 您可以使用类似的模式在控制台内运行文件:f=File.new('path/to/file') 运行使用:f.rewind; eval f.readlines.join("\n");
  • 仅供参考,您不再需要 eval(File.read ...) 部分。 Rails 接受一个 Ruby 文件作为 rails runner 的参数:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
  • 更新-根据@HarisKrajina 在下面的回答,看起来rails r path/to/filename.rb 在功能上等同于上面提到的bundle exec rails runner 命令。
【解决方案2】:
script/console --irb=pry < test.rb > test.log

简单,肮脏,并在最后阻止该过程,但它完全按照我想要的方式完成工作。

【讨论】:

    【解决方案3】:

    其实最简单的方法就是在load里面运行rails console

     load './path/to/foo.rb'
    

    【讨论】:

    • 这很好用。但除非我做错了什么,否则您无权访问在脚本中创建的对象。有什么办法吗?用例是设置一些对象,然后交互式地探索它们。这可能吗?
    • @DanBarron 您可以放入调试器或 binding.pry
    • 这就像一个 Lisp REPL +1
    • Noob help : ./path - 是相对于文件所在的 Rails 项目的路径。
    【解决方案4】:

    在前面提到的这些方法中,没有一个看起来像您期望运行独立脚本那样干净和理想(不是通过

    (对于 Rails 3)

    在脚本顶部插入:

    #!/usr/bin/env ruby
    
    APP_PATH = File.expand_path(appdir = '/srv/staging/strat/fundmgr/config/application',  __FILE__)
    require File.expand_path(appdir + '/../boot',  __FILE__)
    require APP_PATH
    # set Rails.env here if desired
    Rails.application.require_environment!
    
    # your code here...
    

    当然,在 APP_PATH 行中设置您自己的 Rails 应用程序路径。

    这样,我可以避免输入任何交互式 irbrails c 并且可以在 shell 提示符之前测试我的 script.rb。在 crontab 中安排它。

    它也流畅地支持命令行参数,并在获取代码之前最小化包装器的级别。

    CREDIT(也显示了 Rails 2 示例)

    http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html

    【讨论】:

      【解决方案5】:

      这是我正在使用的 hack:

      rr() {
          rails_root="$(bundle exec rails runner "puts Rails.root")"
          rp="$(relpath "$1" "$rails_root")"
          bundle exec rails runner "eval(File.read '$rp')"
      }
      relpath() {python -c "import os.path; print os.path.relpath('$1','${2:-$PWD}')";}
      

      例子:

      cd ~/rails_project/app/helpers
      rr my_script.rb
      

      基于@moritz 在此处的回答。我更改了它,因为 File.read 的工作目录是 Rails 项目的根目录。

      我知道这是一些严重的异端邪说,使用 python 来帮助一个 ruby​​ 脚本。但我找不到 ruby​​ 内置的 relpath 方法。

      信用:relpath() 取自@MestreLion,Convert absolute path into relative path given a current directory using Bash

      【讨论】:

        【解决方案6】:

        同时,该方案已得到支持。

        rails r PATH_TO_RUBY_FILE
        

        现在简单多了。

        【讨论】:

        • 在哪些 Rails 版本中?
        • 我认为 3+,我可以确认 5。
        【解决方案7】:

        考虑创建一个 rake 任务。

        对于我需要创建记录或支持迁移的代码,例如,我经常从this answer 创建一个像这样的 rake 任务。例如:

        lib/tasks/example.rake:

        namespace :example do
          desc "Sample description you'd see if you ran: 'rake --tasks' in the terminal"
          task create_user: :environment do
            User.create! first_name: "Foo", last_name: "Bar"
          end
        end
        

        然后在终端运行:

        rake example:create_user
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-29
          • 1970-01-01
          • 2012-03-15
          • 2013-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多