aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionmailer/CHANGELOG.md9
-rw-r--r--actionmailer/lib/action_mailer/preview.rb12
-rw-r--r--actionmailer/lib/action_mailer/railtie.rb10
-rw-r--r--guides/source/configuring.md12
-rw-r--r--railties/lib/rails/application/finisher.rb2
-rw-r--r--railties/test/application/configuration_test.rb24
-rw-r--r--railties/test/application/mailer_previews_test.rb14
7 files changed, 80 insertions, 3 deletions
diff --git a/actionmailer/CHANGELOG.md b/actionmailer/CHANGELOG.md
index 97ff62fa87..b343e8b373 100644
--- a/actionmailer/CHANGELOG.md
+++ b/actionmailer/CHANGELOG.md
@@ -1,3 +1,12 @@
+* Add `config.action_mailer.preview_enabled` configuration option.
+
+ This config option can be used to enable the mail preview in environments
+ other than development (such as staging).
+
+ Defaults to `true` in development and false elsewhere.
+
+ *Leonard Garvey*
+
* Allow preview interceptors to be registered through
`config.action_mailer.preview_interceptors`.
diff --git a/actionmailer/lib/action_mailer/preview.rb b/actionmailer/lib/action_mailer/preview.rb
index 33a9faa7e7..f27fab1a0d 100644
--- a/actionmailer/lib/action_mailer/preview.rb
+++ b/actionmailer/lib/action_mailer/preview.rb
@@ -11,6 +11,14 @@ module ActionMailer
#
mattr_accessor :preview_path, instance_writer: false
+ # Enable or disable mailer previews through app configuration:
+ #
+ # config.action_mailer.preview_enabled = true
+ #
+ # Defaults to true for development environment
+ #
+ mattr_accessor :preview_enabled, instance_writer: false
+
# :nodoc:
mattr_accessor :preview_interceptors, instance_writer: false
self.preview_interceptors = []
@@ -94,6 +102,10 @@ module ActionMailer
Base.preview_path
end
+ def preview_enabled #:nodoc:
+ Base.preview_enabled
+ end
+
def inform_preview_interceptors(message) #:nodoc:
Base.preview_interceptors.each do |interceptor|
interceptor.previewing_email(message)
diff --git a/actionmailer/lib/action_mailer/railtie.rb b/actionmailer/lib/action_mailer/railtie.rb
index 671551fa53..409a7a897a 100644
--- a/actionmailer/lib/action_mailer/railtie.rb
+++ b/actionmailer/lib/action_mailer/railtie.rb
@@ -18,8 +18,9 @@ module ActionMailer
options.assets_dir ||= paths["public"].first
options.javascripts_dir ||= paths["public/javascripts"].first
options.stylesheets_dir ||= paths["public/stylesheets"].first
+ options.preview_enabled = Rails.env.development? if options.preview_enabled.nil?
- if Rails.env.development?
+ if options.preview_enabled
options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
end
@@ -37,6 +38,13 @@ module ActionMailer
register_observers(options.delete(:observers))
options.each { |k,v| send("#{k}=", v) }
+
+ if options.preview_enabled
+ app.routes.append do
+ get '/rails/mailers' => "rails/mailers#index"
+ get '/rails/mailers/*path' => "rails/mailers#preview"
+ end
+ end
end
end
diff --git a/guides/source/configuring.md b/guides/source/configuring.md
index f74fbaa7c3..68f03c5430 100644
--- a/guides/source/configuring.md
+++ b/guides/source/configuring.md
@@ -453,6 +453,18 @@ There are a number of settings available on `config.action_mailer`:
config.action_mailer.interceptors = ["MailInterceptor"]
```
+* `config.action_mailer.preview_path` specifies the location of mailer previews.
+
+ ```ruby
+ config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"
+ ```
+
+* `config.action_mailer.preview_enabled` enable or disable mailer previews. By default this is `true` in development.
+
+ ```ruby
+ config.action_mailer.preview_enabled = false
+ ```
+
### Configuring Active Support
There are a few configuration options available in Active Support:
diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb
index 5b8509b2e9..7a1bb1e25c 100644
--- a/railties/lib/rails/application/finisher.rb
+++ b/railties/lib/rails/application/finisher.rb
@@ -22,8 +22,6 @@ module Rails
initializer :add_builtin_route do |app|
if Rails.env.development?
app.routes.append do
- get '/rails/mailers' => "rails/mailers#index"
- get '/rails/mailers/*path' => "rails/mailers#preview"
get '/rails/info/properties' => "rails/info#properties"
get '/rails/info/routes' => "rails/info#routes"
get '/rails/info' => "rails/info#index"
diff --git a/railties/test/application/configuration_test.rb b/railties/test/application/configuration_test.rb
index 17b406f6a3..1feedb6602 100644
--- a/railties/test/application/configuration_test.rb
+++ b/railties/test/application/configuration_test.rb
@@ -965,5 +965,29 @@ module ApplicationTests
assert db_config.is_a?(Hash)
end
+
+ test 'config.mail_preview_enabled defaults to true in development' do
+ Rails.env = "development"
+ require "#{app_path}/config/environment"
+
+ assert Rails.application.config.action_mailer.preview_enabled
+ end
+
+ test 'config.mail_preview_enabled defaults to false in production' do
+ Rails.env = "production"
+ require "#{app_path}/config/environment"
+
+ assert_equal Rails.application.config.action_mailer.preview_enabled, false
+ end
+
+ test 'config.mail_preview_enabled can be set in the configuration file' do
+ Rails.env = "production"
+ add_to_config <<-RUBY
+ config.action_mailer.preview_enabled = true
+ RUBY
+ require "#{app_path}/config/environment"
+
+ assert_equal Rails.application.config.action_mailer.preview_enabled, true
+ end
end
end
diff --git a/railties/test/application/mailer_previews_test.rb b/railties/test/application/mailer_previews_test.rb
index c588fd7012..d17eb0a8d1 100644
--- a/railties/test/application/mailer_previews_test.rb
+++ b/railties/test/application/mailer_previews_test.rb
@@ -26,6 +26,20 @@ module ApplicationTests
assert_equal 404, last_response.status
end
+ test "/rails/mailers is accessible with correct configuraiton" do
+ add_to_config "config.action_mailer.preview_enabled = true"
+ app("production")
+ get "/rails/mailers"
+ assert_equal 200, last_response.status
+ end
+
+ test "/rails/mailers is not accessible with preview_enabled = false" do
+ add_to_config "config.action_mailer.preview_enabled = false"
+ app("development")
+ get "/rails/mailers"
+ assert_equal 404, last_response.status
+ end
+
test "mailer previews are loaded from the default preview_path" do
mailer 'notifier', <<-RUBY
class Notifier < ActionMailer::Base