Avoid calls to Rails::Application since this is not the official API.

Your application should *always* reference your application const (as Blog::Application) and Rails.application should be used just internally.
This commit is contained in:
José Valim 2010-07-01 17:07:48 +02:00
parent 9024545a6b
commit 53b34e8476
17 changed files with 58 additions and 83 deletions

View File

@ -167,7 +167,7 @@ module ActionDispatch
#
# You can reload routes if you feel you must:
#
# Rails::Application.reload_routes!
# Rails.application.reload_routes!
#
# This will clear all named routes and reload routes.rb if the file has been modified from
# last load. To absolutely force reloading, use <tt>reload!</tt>.

View File

@ -1,7 +1,7 @@
namespace :db do
task :load_config => :rails_env do
require 'active_record'
ActiveRecord::Base.configurations = Rails::Application.config.database_configuration
ActiveRecord::Base.configurations = Rails.application.config.database_configuration
end
namespace :create do

View File

@ -1,16 +1,15 @@
module ActiveSupport
# This class is responsible to track files and invoke the given block
# whenever one of these files are changed. For example, this class
# is used by Rails to reload routes whenever they are changed upon
# a new request.
# is used by Rails to reload the I18n framework whenever they are
# changed upon a new request.
#
# routes_reloader = ActiveSupport::FileUpdateChecker.new(paths) do
# paths.each { |p| load(p) }
# Rails::Application.routes.reload!
# i18n_reloader = ActiveSupport::FileUpdateChecker.new(paths) do
# I18n.reload!
# end
#
# ActionDispatch::Callbacks.to_prepare do
# routes_reloader.execute_if_updated
# i18n_reloader.execute_if_updated
# end
#
class FileUpdateChecker

View File

@ -11,7 +11,7 @@ This guide first describes the process of +rails server+ then explains the Passe
h3. Launch!
As of Rails 3, +script/server+ has become +rails server+. This was done to centralise all rails related commands to one common file.
As of Rails 3, +script/server+ has become +rails server+. This was done to centralize all rails related commands to one common file.
The actual +rails+ command is kept in _railties/bin/rails_ and goes like this:
@ -58,11 +58,8 @@ In +script/rails+ we see the following:
#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
ENV_PATH = File.expand_path('../../config/environment', __FILE__)
BOOT_PATH = File.expand_path('../../config/boot', __FILE__)
APP_PATH = File.expand_path('../../config/application', __FILE__)
require BOOT_PATH
APP_PATH = File.expand_path('../../config/application', __FILE__)
require File.expand_path('../../config/boot', __FILE__)
require 'rails/commands'
</ruby>
@ -79,15 +76,19 @@ h3. _config/boot.rb_
_config/boot.rb_ is the first stop for everything for initializing your application. This boot process does quite a bit of work for you and so this section attempts to go in-depth enough to explain what each of the pieces does.
<ruby>
# Use Bundler (preferred)
require 'rubygems'
# Set up gems listed in the Gemfile.
gemfile = File.expand_path('../../Gemfile', __FILE__)
begin
require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
require 'rubygems'
ENV['BUNDLE_GEMFILE'] = gemfile
require 'bundler'
Bundler.setup
end
rescue Bundler::GemNotFound => e
STDERR.puts e.message
STDERR.puts "Try running `bundle install`."
exit!
end if File.exist?(gemfile)
</ruby>
h3. Bundled Rails (3.x)
@ -164,33 +165,7 @@ TODO: Prettify when it becomes more stable.
I won't go into what each of these gems are, as that is really something that needs covering on a case-by-case basis. We will however just dig a little under the surface of Bundler.
Back in _config/boot.rb_, the first line will try to include _.bundle/environment.rb_, which doesn't exist in a bare-bones Rails application and because this file does not exist Ruby will raise a +LoadError+ which will be rescued and run the following code:
<ruby>
require 'rubygems'
require 'bundler'
Bundler.setup
</ruby>
+Bundler.setup+ here will load and parse the +Gemfile+ and add the _lib_ directory of the gems mentioned **and** their dependencies (**and** their dependencies' dependencies, and so on) to the +$LOAD_PATH+.
Now we will go down the alternate timeline where we generate a _.bundle/environment.rb_ file using the +bundle lock+ command. This command also creates a _Gemfile.lock_ file which is actually a YAML file loaded by this method in Bundler before it moves on to check for _Gemfile_:
<ruby>
def definition(gemfile = default_gemfile)
configure
root = Pathname.new(gemfile).dirname
lockfile = root.join("Gemfile.lock")
if lockfile.exist?
Definition.from_lock(lockfile)
else
Definition.from_gemfile(gemfile)
end
end
</ruby>
The _.bundle/environment.rb_ file adds the _lib_ directory of all the gems specified in +Gemfile.lock+ to +$LOAD_PATH+.
Back in _config/boot.rb_, we call +Bundler.setup+ which will load and parse the +Gemfile+ and add the _lib_ directory of the gems mentioned **and** their dependencies (**and** their dependencies' dependencies, and so on) to the +$LOAD_PATH+.
h3. Requiring Rails
@ -326,6 +301,11 @@ As you can see for the duration of the +eager_autoload+ block the class variable
module ActiveSupport
extend ActiveSupport::Autoload
autoload :DescendantsTracker
autoload :FileUpdateChecker
autoload :LogSubscriber
autoload :Notifications
# TODO: Narrow this list down
eager_autoload do
autoload :BacktraceCleaner
@ -348,7 +328,6 @@ As you can see for the duration of the +eager_autoload+ block the class variable
autoload :OptionMerger
autoload :OrderedHash
autoload :OrderedOptions
autoload :Notifications
autoload :Rescuable
autoload :SecureRandom
autoload :StringInquirer
@ -589,19 +568,20 @@ This file (_railties/lib/rails.rb_) requires the very, very basics that Rails ne
require 'action_dispatch/railtie'
</ruby>
+require 'pathname'+ requires the Pathname class which is used for returning a Pathname object for +Rails.root+ so that instead of doing:
<ruby>
File.join(Rails.root, "app/controllers")
</ruby>
You may do:
+require 'pathname'+ requires the Pathname class which is used for returning a Pathname object for +Rails.root+. Although is coming to use this path name to generate paths as below:
<ruby>
Rails.root.join("app/controllers")
</ruby>
Although this is not new to Rails 3 (it was available in 2.3.5), it is something worthwhile pointing out.
Pathname can also be converted to string, so the following syntax is preferred:
<ruby>
"#{Rails.root}/app/controllers"
</ruby>
This works because Ruby automatically handles file path conversions. Although this is not new to Rails 3 (it was available in 2.3.5), it is something worthwhile pointing out.
Inside this file there are other helpful helper methods defined, such as +Rails.root+, +Rails.env+, +Rails.logger+ and +Rails.application+.
@ -1833,7 +1813,7 @@ We do not already have a +Rails.application+, so instead this resorts to calling
end
</ruby>
This +called_from+ setting looks a little overwhelming to begin with, but the short end of it is that it returns the route to your application's config directory, something like: _/home/you/yourapp/config_. After +called_from+ has been set, +super+ is again called and this means the +Rails::Railtie#inherited+ method (in _railties/lib/rails/railtie.rb_):
This +called_from+ setting looks a little overwhelming to begin with, but the short end of it is that it returns your application's root, something like: _/home/you/yourapp_. After +called_from+ has been set, +super+ is again called and this means the +Rails::Railtie#inherited+ method (in _railties/lib/rails/railtie.rb_):
<ruby>
def inherited(base)

View File

@ -8,14 +8,6 @@ module Rails
# In Rails 3.0, a Rails::Application object was introduced which is nothing more than
# an Engine but with the responsibility of coordinating the whole boot process.
#
# Opposite to Rails::Engine, you can only have one Rails::Application instance
# in your process and both Rails::Application and YourApplication::Application
# points to it.
#
# In other words, Rails::Application is Singleton and whenever you are accessing
# Rails::Application.config or YourApplication::Application.config, you are actually
# accessing YourApplication::Application.instance.config.
#
# == Initialization
#
# Rails::Application is responsible for executing all railties, engines and plugin
@ -57,6 +49,10 @@ module Rails
def instance
if self == Rails::Application
if Rails.application
ActiveSupport::Deprecation.warn "Calling a method in Rails::Application is deprecated, " <<
"please call it directly in your application constant #{Rails.application.class.name}.", caller
end
Rails.application
else
@@instance ||= new

View File

@ -13,27 +13,27 @@ command = aliases[command] || command
case command
when 'generate', 'destroy', 'plugin', 'benchmarker', 'profiler'
require APP_PATH
Rails::Application.require_environment!
Rails.application.require_environment!
require "rails/commands/#{command}"
when 'console'
require 'rails/commands/console'
require APP_PATH
Rails::Application.require_environment!
Rails::Console.start(Rails::Application)
Rails.application.require_environment!
Rails::Console.start(Rails.application)
when 'server'
require 'rails/commands/server'
Rails::Server.new.tap { |server|
require APP_PATH
Dir.chdir(Rails::Application.root)
Dir.chdir(Rails.application.root)
server.start
}
when 'dbconsole'
require 'rails/commands/dbconsole'
require APP_PATH
Rails::DBConsole.start(Rails::Application)
Rails::DBConsole.start(Rails.application)
when 'application', 'runner'
require "rails/commands/#{command}"

View File

@ -37,7 +37,7 @@ ARGV.delete(code_or_file)
ENV["RAILS_ENV"] = options[:environment]
require APP_PATH
Rails::Application.require_environment!
Rails.application.require_environment!
begin
if code_or_file.nil?

View File

@ -4,4 +4,4 @@
require File.expand_path('../config/application', __FILE__)
require 'rake'
Rails::Application.load_tasks
<%= app_const %>.load_tasks

View File

@ -4,4 +4,4 @@
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
Rails.application.config.secret_token = '<%= app_secret %>'
<%= app_const %>.config.secret_token = '<%= app_secret %>'

View File

@ -1,8 +1,8 @@
# Be sure to restart your server when you modify this file.
Rails.application.config.session_store :cookie_store, :key => '_<%= app_name %>_session'
<%= app_const %>.config.session_store :cookie_store, :key => '_<%= app_name %>_session'
# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rake db:sessions:create")
# Rails.application.config.session_store :active_record_store
# <%= app_const %>.config.session_store :active_record_store

View File

@ -1,3 +1,3 @@
Rails.application.routes.draw do |map|
Rails.application.routes.draw do
match '/rails/info/properties' => "rails/info#properties"
end

View File

@ -3,5 +3,5 @@ task :middleware => :environment do
Rails.configuration.middleware.each do |middleware|
puts "use #{middleware.inspect}"
end
puts "run #{Rails::Application.instance.class.name}.routes"
puts "run #{Rails.application.class.name}.routes"
end

View File

@ -1,6 +1,6 @@
desc 'Print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.'
task :routes => :environment do
Rails::Application.reload_routes!
Rails.application.reload_routes!
all_routes = ENV['CONTROLLER'] ? Rails.application.routes.routes.select { |route| route.defaults[:controller] == ENV['CONTROLLER'] } : Rails.application.routes.routes
routes = all_routes.collect do |route|
# TODO: The :index method is deprecated in 1.9 in favor of :key

View File

@ -36,7 +36,7 @@ module ApplicationTests
test "allows me to configure default url options for ActionMailer" do
app_file "config/environments/development.rb", <<-RUBY
Rails::Application.configure do
AppTemplate::Application.configure do
config.action_mailer.default_url_options = { :host => "test.rails" }
end
RUBY

View File

@ -16,7 +16,7 @@ module ApplicationTests
end
def app
@app ||= Rails::Application
@app ||= Rails.application
end
def assert_fallbacks(fallbacks)

View File

@ -24,11 +24,11 @@ module ApplicationTests
app_file "config/environment.rb", <<-RUBY
SuperMiddleware = Struct.new(:app)
Rails::Application.configure do
AppTemplate::Application.configure do
config.middleware.use SuperMiddleware
end
Rails::Application.initialize!
AppTemplate::Application.initialize!
RUBY
assert_match "SuperMiddleware", Dir.chdir(app_path){ `rake middleware` }

View File

@ -11,7 +11,7 @@ class InfoControllerTest < ActionController::TestCase
tests Rails::InfoController
def setup
Rails.application.routes.draw do |map|
Rails.application.routes.draw do
match '/rails/info/properties' => "rails/info#properties"
end
@controller.stubs(:consider_all_requests_local? => false, :local_request? => true)