提交 32baa278 编写于 作者: P Piotr Sarnacki

Include routes helpers only for inherited classes in ActionMailer

上级 befa77fc
......@@ -5,6 +5,7 @@
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/proc'
require 'action_mailer/log_subscriber'
require 'action_mailer/hide_actions'
module ActionMailer #:nodoc:
# Action Mailer allows you to send email from your application using a mailer model and views.
......@@ -346,6 +347,7 @@ class Base < AbstractController::Base
helper ActionMailer::MailHelper
include ActionMailer::OldApi
include ActionMailer::HideActions
delegate :register_observer, :to => Mail
delegate :register_interceptor, :to => Mail
......@@ -361,6 +363,11 @@ class Base < AbstractController::Base
}.freeze
class << self
def inherited(klass)
klass.with_hiding_actions do
super(klass)
end
end
def mailer_name
@mailer_name ||= name.underscore
......@@ -725,27 +732,8 @@ def insert_part(container, response, charset) #:nodoc:
container.add_part(part)
end
module DeprecatedUrlOptions
def default_url_options
deprecated_url_options
end
def default_url_options=(val)
deprecated_url_options
end
def deprecated_url_options
raise "You can no longer call ActionMailer::Base.default_url_options " \
"directly. You need to set config.action_mailer.default_url_options. " \
"If you are using ActionMailer standalone, you need to include the " \
"routing url_helpers directly."
end
end
# This module will complain if the user tries to set default_url_options
# directly instead of through the config object. In Action Mailer's Railtie,
# we include the router's url_helpers, which will override this module.
extend DeprecatedUrlOptions
class_attribute :default_url_options
self.default_url_options = {}
ActiveSupport.run_load_hooks(:action_mailer, self)
end
......
require 'active_support/core_ext/class/attribute'
module ActionMailer
# ActionController::HideActions adds the ability to prevent public methods on a controller
# to be called as actions.
module HideActions
extend ActiveSupport::Concern
included do
class_attribute :hidden_actions
self.hidden_actions = Set.new.freeze
end
private
module ClassMethods
# Sets all of the actions passed in as hidden actions.
#
# ==== Parameters
# *args<#to_s>:: A list of actions
def hide_action(*args)
self.hidden_actions = hidden_actions.dup.merge(args.map(&:to_s)).freeze
end
# Run block and add all the new action_methods to hidden_actions.
# This is used in inherited method.
def with_hiding_actions
yield
clear_action_methods!
hide_action(*action_methods)
clear_action_methods!
end
def clear_action_methods!
@action_methods = nil
end
# Overrides AbstractController::Base#action_methods to remove any methods
# that are listed as hidden methods.
def action_methods
@action_methods ||= super.reject { |name| hidden_actions.include?(name) }
end
end
end
end
......@@ -19,9 +19,8 @@ class Railtie < Rails::Railtie
options.stylesheets_dir ||= paths.public.stylesheets.to_a.first
ActiveSupport.on_load(:action_mailer) do
include app.routes.url_helpers
extend ::ActionMailer::Railties::RoutesHelpers.with(app.routes)
include app.routes.mounted_helpers(:app)
extend ::ActionMailer::Railties::RoutesHelpers
options.each { |k,v| send("#{k}=", v) }
end
end
......
module ActionMailer
module Railties
module RoutesHelpers
def inherited(klass)
super(klass)
if namespace = klass.parents.detect {|m| m.respond_to?(:_railtie) }
klass.send(:include, namespace._railtie.routes.url_helpers)
def self.with(routes)
Module.new do
define_method(:inherited) do |klass|
super(klass)
if namespace = klass.parents.detect {|m| m.respond_to?(:_railtie) }
klass.send(:include, namespace._railtie.routes.url_helpers)
else
klass.send(:include, routes.url_helpers)
end
end
end
end
end
......
......@@ -410,6 +410,7 @@ class MyMailer < ActionMailer::Base
assert_equal Bukkits._railtie, Bukkits::Engine
assert ::Bukkits::MyMailer.method_defined?(:foo_path)
assert !::Bukkits::MyMailer.method_defined?(:bar_path)
env = Rack::MockRequest.env_for("/bukkits/from_app")
response = AppTemplate::Application.call(env)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册