From 3713e433667ee95caccb53a4062f540405272234 Mon Sep 17 00:00:00 2001 From: Andrew White Date: Sat, 4 Jan 2014 18:42:34 +0000 Subject: Add preview_path to autoload_paths in after_initialize Only config.autoload_paths is frozen, so add the preview_path to ActiveSupport::Dependencies.autoload_paths directly in an after_initialize block. Also protect against a blank preview_path being added to autoload_paths which can cause a serious slowdown as Dir[] tries to load all *_preview.rb files under / Fixes #13372 --- actionmailer/lib/action_mailer/preview.rb | 8 ++++- actionmailer/lib/action_mailer/railtie.rb | 12 ++++--- railties/test/application/mailer_previews_test.rb | 42 ++++++++++++++++++++++- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/actionmailer/lib/action_mailer/preview.rb b/actionmailer/lib/action_mailer/preview.rb index 43d9ec4bb5..ecceaf8c70 100644 --- a/actionmailer/lib/action_mailer/preview.rb +++ b/actionmailer/lib/action_mailer/preview.rb @@ -56,12 +56,18 @@ module ActionMailer protected def load_previews #:nodoc: - Dir["#{preview_path}/**/*_preview.rb"].each{ |file| require_dependency file } + if preview_path? + Dir["#{preview_path}/**/*_preview.rb"].each{ |file| require_dependency file } + end end def preview_path #:nodoc: Base.preview_path end + + def preview_path? #:nodoc: + Base.preview_path? + end end end end diff --git a/actionmailer/lib/action_mailer/railtie.rb b/actionmailer/lib/action_mailer/railtie.rb index af8009ba97..c893ddfef5 100644 --- a/actionmailer/lib/action_mailer/railtie.rb +++ b/actionmailer/lib/action_mailer/railtie.rb @@ -19,6 +19,10 @@ module ActionMailer options.javascripts_dir ||= paths["public/javascripts"].first options.stylesheets_dir ||= paths["public/stylesheets"].first + if Rails.env.development? + options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil + end + # make sure readers methods get compiled options.asset_host ||= app.config.asset_host options.relative_url_root ||= app.config.relative_url_root @@ -41,11 +45,9 @@ module ActionMailer end end - initializer "action_mailer.configure_mailer_previews", before: :set_autoload_paths do |app| - if Rails.env.development? - options = app.config.action_mailer - options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil - app.config.autoload_paths << options.preview_path + config.after_initialize do + if ActionMailer::Base.preview_path? + ActiveSupport::Dependencies.autoload_paths << ActionMailer::Base.preview_path end end end diff --git a/railties/test/application/mailer_previews_test.rb b/railties/test/application/mailer_previews_test.rb index 14abb33cc6..c588fd7012 100644 --- a/railties/test/application/mailer_previews_test.rb +++ b/railties/test/application/mailer_previews_test.rb @@ -225,6 +225,46 @@ module ApplicationTests assert_no_match '
  • bar
  • ', last_response.body end + test "mailer previews are reloaded from a custom preview_path" do + add_to_config "config.action_mailer.preview_path = '#{app_path}/lib/mailer_previews'" + + app('development') + + get "/rails/mailers" + assert_no_match '

    Notifier

    ', last_response.body + + mailer 'notifier', <<-RUBY + class Notifier < ActionMailer::Base + default from: "from@example.com" + + def foo + mail to: "to@example.org" + end + end + RUBY + + text_template 'notifier/foo', <<-RUBY + Hello, World! + RUBY + + app_file 'lib/mailer_previews/notifier_preview.rb', <<-RUBY + class NotifierPreview < ActionMailer::Preview + def foo + Notifier.foo + end + end + RUBY + + get "/rails/mailers" + assert_match '

    Notifier

    ', last_response.body + + remove_file 'lib/mailer_previews/notifier_preview.rb' + sleep(1) + + get "/rails/mailers" + assert_no_match '

    Notifier

    ', last_response.body + end + test "mailer preview not found" do app('development') get "/rails/mailers/notifier" @@ -366,7 +406,7 @@ module ApplicationTests private def build_app super - app_file 'config/routes.rb', "Rails.application.routes.draw do; end" + app_file "config/routes.rb", "Rails.application.routes.draw do; end" end def mailer(name, contents) -- cgit v1.2.3