Help us understand the problem. What is going on with this article?

rakeタスクを定義するときのおまじない :environment がやっていること

More than 5 years have passed since last update.

おまじない

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/environmentrequireされる

# 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.rbrequireして
Rails.application.initialize!してた

なので、DBやモデルにアクセスするとき以外にも使える

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away