Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 9aa7e29758
Fetching contributors…

Cannot retrieve contributors at this time

160 lines (145 sloc) 5.385 kb
# encoding: utf-8
require "mongoid"
require "mongoid/config"
require "mongoid/railties/document"
require "rails"
require "rails/mongoid"
module Rails
module Mongoid
class Railtie < Rails::Railtie
# Determine which generator to use. app_generators was introduced after
# 3.0.0.
#
# @example Get the generators method.
# railtie.generators
#
# @return [ Symbol ] The method name to use.
#
# @since 2.0.0.rc.4
def self.generator
config.respond_to?(:app_generators) ? :app_generators : :generators
end
# Mapping of rescued exceptions to HTTP responses
#
# @example
# railtie.rescue_responses
#
# @ return [Hash] rescued responses
#
# @since 2.4.3
def self.rescue_responses
{
"Mongoid::Errors::DocumentNotFound" => :not_found,
"Mongoid::Errors::Validations" => 422
}
end
config.send(generator).orm :mongoid, migration: false
if config.action_dispatch.rescue_responses
config.action_dispatch.rescue_responses.merge!(rescue_responses)
end
rake_tasks do
load "mongoid/railties/database.rake"
end
# Exposes Mongoid's configuration to the Rails application configuration.
#
# @example Set up configuration in the Rails app.
# module MyApplication
# class Application < Rails::Application
# config.mongoid.logger = Logger.new($stdout, :warn)
# config.mongoid.persist_in_safe_mode = true
# end
# end
config.mongoid = ::Mongoid::Config
# Initialize Mongoid. This will look for a mongoid.yml in the config
# directory and configure mongoid appropriately.
#
# @example mongoid.yml
#
# development:
# host: localhost
# database: mongoid
# slaves:
# # - host: localhost
# # port: 27018
# # - host: localhost
# # port: 27019
# allow_dynamic_fields: false
# persist_in_safe_mode: false
#
initializer "setup database" do
config_file = Rails.root.join("config", "mongoid.yml")
if config_file.file?
begin
::Mongoid.load!(config_file)
rescue ::Mongoid::Errors::NoSessionsConfig => e
handle_configuration_error(e)
rescue ::Mongoid::Errors::NoDefaultSession => e
handle_configuration_error(e)
rescue ::Mongoid::Errors::NoSessionDatabase => e
handle_configuration_error(e)
rescue ::Mongoid::Errors::NoSessionHosts => e
handle_configuration_error(e)
end
end
end
# After initialization we will warn the user if we can't find a mongoid.yml and
# alert to create one.
initializer "warn when configuration is missing" do
config.after_initialize do
unless Rails.root.join("config", "mongoid.yml").file?
puts "\nMongoid config not found. Create a config file at: config/mongoid.yml"
puts "to generate one run: rails generate mongoid:config\n\n"
end
end
end
# Set the proper error types for Rails. DocumentNotFound errors should be
# 404s and not 500s, validation errors are 422s.
initializer "load http errors" do |app|
config.after_initialize do
unless config.action_dispatch.rescue_responses
ActionDispatch::ShowExceptions.rescue_responses.update(Railtie.rescue_responses)
end
end
end
# Due to all models not getting loaded and messing up inheritance queries
# and indexing, we need to preload the models in order to address this.
#
# This will happen every request in development, once in ther other
# environments.
initializer "preload all application models" do |app|
config.to_prepare do
if $rails_rake_task
# We previously got rid of this, however in the case where
# threadsafe! is enabled we must load all models so things like
# creating indexes works properly.
::Rails::Mongoid.load_models(app)
else
::Rails::Mongoid.preload_models(app)
end
end
end
# Need to include the Mongoid identity map middleware.
initializer "include the identity map" do |app|
app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap"
end
# Instantitate any registered observers after Rails initialization and
# instantiate them after being reloaded in the development environment
initializer "instantiate observers" do
config.after_initialize do
::Mongoid::instantiate_observers
ActionDispatch::Reloader.to_prepare do
::Mongoid.instantiate_observers
end
end
end
# Rails runs all initializers first before getting into any generator
# code, so we have no way in the intitializer to know if we are
# generating a mongoid.yml. So instead of failing, we catch all the
# errors and print them out.
def handle_configuration_error(e)
puts "There is a configuration error with the current mongoid.yml."
puts e.message
end
end
end
end
Jump to Line
Something went wrong with that request. Please try again.