おまじない
task test: :environment do
# task
end
railsでDBアクセスしたりするrakeタスクを定義するときに↑の様な感じで:environment
を指定する必要があるが、
その:environment
が何をしているのか不思議だったので調べた
コードを追ってみた(要所だけ)
# https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L432-L441
def run_tasks_blocks(app) #:nodoc:
railties.each { |r| r.run_tasks_blocks(app) }
super
require "rails/tasks"
task :environment do
ActiveSupport.on_load(:before_initialize) { config.eager_load = false }
require_environment!
end
end
railsのコード内に定義されている、
:environment
という名のrakeタスクが呼ばれる
# https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L317-L320
def require_environment! #:nodoc:
environment = paths["config/environment"].existent.first
require environment if environment
end
Rails.root
にあるconfig/environment
がrequire
される
# config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# Initialize the Rails application.
Rails.application.initialize!
Rails.application.initialize!
が呼ばれる
まとめ
三行で書くと
:enviroment
というrakeタスクを実行して
config/environment.rb
をrequire
して
Rails.application.initialize!
してた
なので、DBやモデルにアクセスするとき以外にも使える