bin/rails runner

Railsのクラス群を読み込んだ状態でコードを実行するコマンド。

以下のようなコードがあるとする。

# app/models/user.rb

class User < ApplicationRecord
  def self.calc
    puts 10 + 100
  end
end

上記のコードがある状態で、bin/rails runner User.calcを実行すると以下のような出力になる。

Running via Spring preloader in process 5062
110

bin/rails runner ファイルという形で実行することもできる。あくまで例として以下のようにファイルを書き換えて実行してみる。

# app/models/user.rb

class User < ApplicationRecord
  def self.calc
    puts 10 + 100
  end
end

User.calc

bin/rails runner app/models/user.rbを実行すると以下のようになる(2回出力されているのは、runnerでの実行の前にクラス読み込みのタイミングで実行されているせいと思われる)。

Running via Spring preloader in process 5162
110
110

runnerコマンドで指定するコードをどこにおくかであるが、libディレクトリ以下に格納することが多いようである。

lib/batch/maintenance.rbBatch::Maintenance.runクラスメソッドを作ったとしても、デフォルトではオートロードのパスに含まれないのでbin/rails runner Batch::Maintenance.runとしてもエラーになる。

ロードパスに追加するためにconfig/application.rbに以下を追加する。

    config.paths.add 'lib', eager_load: true

ロードパスの追加に関しては、以下を参照。

ロードパスの変更が反映させるために、bin/spring stopコマンドを実行しておく。

実行環境を指定したい場合は、bin/rails runner -e staging Batch::Maintenance.runのようにする。