From 4f89fdec7c124b0ac32f2107872c40c70526cf76 Mon Sep 17 00:00:00 2001 From: camelmasa Date: Mon, 8 Sep 2014 01:05:25 +0900 Subject: [PATCH] Add support for multiple preview_path --- actionmailer/lib/action_mailer/base.rb | 4 +-- actionmailer/lib/action_mailer/preview.rb | 6 ++-- actionmailer/lib/action_mailer/railtie.rb | 8 +---- actionpack/test/controller/resources_test.rb | 18 +++++----- guides/source/configuring.md | 4 +-- railties/lib/rails/engine/configuration.rb | 2 ++ .../test/application/mailer_previews_test.rb | 36 +++++++++++++++++++ 7 files changed, 54 insertions(+), 24 deletions(-) diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index af389cf66c716..26d72ed411905 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -335,9 +335,7 @@ module ActionMailer # Methods must return a Mail::Message object which can be generated by calling the mailer # method without the additional deliver_now / deliver_later. The location of the # mailer previews directory can be configured using the preview_paths option which has a default - # of test/mailers/previews: - # - # config.action_mailer.preview_paths = "#{Rails.root}/lib/mailer_previews" + # of test/mailers/previews # # An overview of all previews is accessible at http://localhost:3000/rails/mailers # on a running development server instance. diff --git a/actionmailer/lib/action_mailer/preview.rb b/actionmailer/lib/action_mailer/preview.rb index d50bc05146b55..31b02bd2e93bc 100644 --- a/actionmailer/lib/action_mailer/preview.rb +++ b/actionmailer/lib/action_mailer/preview.rb @@ -5,9 +5,9 @@ module Previews #:nodoc: extend ActiveSupport::Concern included do - # Set the location of mailer previews through app configuration: + # Add the location of mailer previews through app configuration: # - # config.action_mailer.preview_paths = "#{Rails.root}/lib/mailer_previews" + # config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews" # mattr_accessor :preview_paths, instance_writer: false @@ -96,7 +96,7 @@ def preview_name protected def load_previews #:nodoc: if preview_paths - Dir["#{preview_paths}/**/*_preview.rb"].each{ |file| require_dependency file } + preview_paths.existent.each{ |file| require_dependency file } end end diff --git a/actionmailer/lib/action_mailer/railtie.rb b/actionmailer/lib/action_mailer/railtie.rb index 26a8476e3eeac..aeffb7e75a53f 100644 --- a/actionmailer/lib/action_mailer/railtie.rb +++ b/actionmailer/lib/action_mailer/railtie.rb @@ -22,7 +22,7 @@ class Railtie < Rails::Railtie # :nodoc: options.show_previews = Rails.env.development? if options.show_previews.nil? if options.show_previews - options.preview_paths ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil + options.preview_paths ||= paths["test/mailers/previews"] end # make sure readers methods get compiled @@ -54,11 +54,5 @@ class Railtie < Rails::Railtie # :nodoc: config.compile_methods! if config.respond_to?(:compile_methods!) end end - - config.after_initialize do - if ActionMailer::Base.preview_paths - ActiveSupport::Dependencies.autoload_paths << ActionMailer::Base.preview_paths - end - end end end diff --git a/actionpack/test/controller/resources_test.rb b/actionpack/test/controller/resources_test.rb index da116e6ae2201..a5f43c4b6b45d 100644 --- a/actionpack/test/controller/resources_test.rb +++ b/actionpack/test/controller/resources_test.rb @@ -346,13 +346,13 @@ def test_with_new_action end preview_options = {:action => 'preview'} - preview_paths = "/messages/new/preview" + preview_path = "/messages/new/preview" assert_restful_routes_for :messages do |options| - assert_recognizes(options.merge(preview_options), :path => preview_paths, :method => :post) + assert_recognizes(options.merge(preview_options), :path => preview_path, :method => :post) end assert_restful_named_routes_for :messages do |options| - assert_named_route preview_paths, :preview_new_message_path, preview_options + assert_named_route preview_path, :preview_new_message_path, preview_options end end end @@ -368,13 +368,13 @@ def test_with_new_action_with_name_prefix end preview_options = {:action => 'preview', :thread_id => '1'} - preview_paths = "/threads/1/messages/new/preview" + preview_path = "/threads/1/messages/new/preview" assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| - assert_recognizes(options.merge(preview_options), :path => preview_paths, :method => :post) + assert_recognizes(options.merge(preview_options), :path => preview_path, :method => :post) end assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| - assert_named_route preview_paths, :preview_new_thread_message_path, preview_options + assert_named_route preview_path, :preview_new_thread_message_path, preview_options end end end @@ -390,13 +390,13 @@ def test_with_formatted_new_action_with_name_prefix end preview_options = {:action => 'preview', :thread_id => '1', :format => 'xml'} - preview_paths = "/threads/1/messages/new/preview.xml" + preview_path = "/threads/1/messages/new/preview.xml" assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| - assert_recognizes(options.merge(preview_options), :path => preview_paths, :method => :post) + assert_recognizes(options.merge(preview_options), :path => preview_path, :method => :post) end assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| - assert_named_route preview_paths, :preview_new_thread_message_path, preview_options + assert_named_route preview_path, :preview_new_thread_message_path, preview_options end end end diff --git a/guides/source/configuring.md b/guides/source/configuring.md index 4be9ac70aaa1b..e1b7605fe5d97 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -453,10 +453,10 @@ There are a number of settings available on `config.action_mailer`: config.action_mailer.interceptors = ["MailInterceptor"] ``` -* `config.action_mailer.preview_paths` specifies the location of mailer previews. +* `config.action_mailer.preview_paths` adds the location of mailer previews. ```ruby - config.action_mailer.preview_paths = "#{Rails.root}/lib/mailer_previews" + config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews" ``` * `config.action_mailer.show_previews` enable or disable mailer previews. By default this is `true` in development. diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb index 10d1821709e0f..7e8ca1aec968c 100644 --- a/railties/lib/rails/engine/configuration.rb +++ b/railties/lib/rails/engine/configuration.rb @@ -67,6 +67,8 @@ def paths paths.add "vendor", load_path: true paths.add "vendor/assets", glob: "*" + paths.add "test/mailers/previews", glob: "**/*_preview.rb" + paths end end diff --git a/railties/test/application/mailer_previews_test.rb b/railties/test/application/mailer_previews_test.rb index 4fefa59e92008..a58903e30162f 100644 --- a/railties/test/application/mailer_previews_test.rb +++ b/railties/test/application/mailer_previews_test.rb @@ -102,6 +102,42 @@ def foo assert_match '
  • foo
  • ', last_response.body end + test "mailer previews are loaded from a custom preview_path when it's multiple" do + add_to_config "config.action_mailer.preview_path = ['#{app_path}/lib/notifier_previews', '#{app_path}/lib/confirm_previews']" + + ['notifier', 'confirm'].each do |keyword| + mailer keyword, <<-RUBY + class #{keyword.camelize} < ActionMailer::Base + default from: "from@example.com" + + def foo + mail to: "to@example.org" + end + end + RUBY + + text_template "#{keyword}/foo", <<-RUBY + Hello, World! + RUBY + + app_file "lib/#{keyword}_previews/notifier_preview.rb", <<-RUBY + class #{keyword.camelize}Preview < ActionMailer::Preview + def foo + #{keyword.camelize}.foo + end + end + RUBY + end + + app('development') + + get "/rails/mailers" + assert_match '

    Notifier

    ', last_response.body + assert_match '
  • foo
  • ', last_response.body + assert_match '

    Confirm

    ', last_response.body + assert_match '
  • foo
  • ', last_response.body + end + test "mailer previews are reloaded across requests" do app('development')