mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
parent
ddbeb15a5e
commit
0cac68d3be
14 changed files with 95 additions and 84 deletions
|
@ -7,4 +7,4 @@ module AbstractController
|
|||
autoload :Renderer, "action_controller/abstract/renderer"
|
||||
# === Exceptions
|
||||
autoload :ActionNotFound, "action_controller/abstract/exceptions"
|
||||
end
|
||||
end
|
|
@ -1,38 +1,41 @@
|
|||
module AbstractController
|
||||
class Base
|
||||
|
||||
attr_internal :response_body
|
||||
attr_internal :response_obj
|
||||
attr_internal :action_name
|
||||
|
||||
|
||||
def self.process(action)
|
||||
new.process(action)
|
||||
end
|
||||
|
||||
|
||||
def self.inherited(klass)
|
||||
end
|
||||
|
||||
|
||||
def initialize
|
||||
self.response_obj = {}
|
||||
end
|
||||
|
||||
|
||||
def process(action_name)
|
||||
unless respond_to_action?(action_name)
|
||||
raise ActionNotFound, "The action '#{action_name}' could not be found"
|
||||
end
|
||||
|
||||
|
||||
@_action_name = action_name
|
||||
process_action
|
||||
self.response_obj[:body] = self.response_body
|
||||
self
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def process_action
|
||||
respond_to?(action_name) ? send(action_name) : send(:action_missing, action_name)
|
||||
end
|
||||
|
||||
|
||||
def respond_to_action?(action_name)
|
||||
respond_to?(action_name) || respond_to?(:action_missing, true)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
|
@ -13,7 +13,7 @@ module AbstractController
|
|||
super
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
module ClassMethods
|
||||
def _normalize_callback_options(options)
|
||||
if only = options[:only]
|
||||
|
@ -21,11 +21,11 @@ module AbstractController
|
|||
options[:per_key] = {:if => only}
|
||||
end
|
||||
if except = options[:except]
|
||||
except = Array(except).map {|e| "action_name == :#{e}"}.join(" || ")
|
||||
except = Array(except).map {|e| "action_name == :#{e}"}.join(" || ")
|
||||
options[:per_key] = {:unless => except}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
[:before, :after, :around].each do |filter|
|
||||
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
||||
def #{filter}_filter(*names, &blk)
|
||||
|
@ -40,4 +40,4 @@ module AbstractController
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,3 +1,3 @@
|
|||
module AbstractController
|
||||
class ActionNotFound < StandardError ; end
|
||||
end
|
||||
end
|
|
@ -8,14 +8,14 @@ module AbstractController
|
|||
extlib_inheritable_accessor :master_helper_module
|
||||
self.master_helper_module = Module.new
|
||||
end
|
||||
|
||||
|
||||
# def self.included(klass)
|
||||
# klass.class_eval do
|
||||
# extlib_inheritable_accessor :master_helper_module
|
||||
# self.master_helper_module = Module.new
|
||||
# end
|
||||
# end
|
||||
|
||||
|
||||
def _action_view
|
||||
@_action_view ||= begin
|
||||
av = super
|
||||
|
@ -23,19 +23,19 @@ module AbstractController
|
|||
av
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
module ClassMethods
|
||||
def inherited(klass)
|
||||
klass.master_helper_module = Module.new
|
||||
klass.master_helper_module.__send__ :include, master_helper_module
|
||||
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
|
||||
def add_template_helper(mod)
|
||||
master_helper_module.module_eval { include mod }
|
||||
end
|
||||
|
||||
|
||||
def helper_method(*meths)
|
||||
meths.flatten.each do |meth|
|
||||
master_helper_module.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
|
||||
|
@ -45,7 +45,7 @@ module AbstractController
|
|||
ruby_eval
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def helper(*args, &blk)
|
||||
args.flatten.each do |arg|
|
||||
case arg
|
||||
|
@ -56,5 +56,6 @@ module AbstractController
|
|||
master_helper_module.module_eval(&blk) if block_given?
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
|
@ -9,18 +9,18 @@ module AbstractController
|
|||
unless [String, Symbol, FalseClass, NilClass].include?(layout.class)
|
||||
raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
|
||||
end
|
||||
|
||||
|
||||
@_layout = layout || false # Converts nil to false
|
||||
_write_layout_method
|
||||
end
|
||||
|
||||
|
||||
def _implied_layout_name
|
||||
name.underscore
|
||||
end
|
||||
|
||||
|
||||
# Takes the specified layout and creates a _layout method to be called
|
||||
# by _default_layout
|
||||
#
|
||||
#
|
||||
# If the specified layout is a:
|
||||
# String:: return the string
|
||||
# Symbol:: call the method specified by the symbol
|
||||
|
@ -49,34 +49,35 @@ module AbstractController
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def _render_template(template, options)
|
||||
_action_view._render_template_with_layout(template, options[:_layout])
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def _layout() end # This will be overwritten
|
||||
|
||||
|
||||
def _layout_for_name(name)
|
||||
unless [String, FalseClass, NilClass].include?(name.class)
|
||||
raise ArgumentError, "String, false, or nil expected; you passed #{name.inspect}"
|
||||
end
|
||||
|
||||
|
||||
name && view_paths.find_by_parts(name, {:formats => formats}, "layouts")
|
||||
end
|
||||
|
||||
|
||||
def _default_layout(require_layout = false)
|
||||
if require_layout && !_layout
|
||||
raise ArgumentError,
|
||||
raise ArgumentError,
|
||||
"There was no default layout for #{self.class} in #{view_paths.inspect}"
|
||||
end
|
||||
|
||||
|
||||
begin
|
||||
layout = _layout_for_name(_layout)
|
||||
rescue NameError => e
|
||||
raise NoMethodError,
|
||||
raise NoMethodError,
|
||||
"You specified #{@_layout.inspect} as the layout, but no such method was found"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -6,4 +6,4 @@ module AbstractController
|
|||
cattr_accessor :logger
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -15,22 +15,22 @@ module AbstractController
|
|||
end
|
||||
|
||||
def _action_view
|
||||
@_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
|
||||
@_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
|
||||
end
|
||||
|
||||
|
||||
def render(options = {})
|
||||
self.response_body = render_to_body(options)
|
||||
end
|
||||
|
||||
|
||||
# Raw rendering of a template to a Rack-compatible body.
|
||||
# ====
|
||||
# @option _prefix<String> The template's path prefix
|
||||
# @option _layout<String> The relative path to the layout template to use
|
||||
#
|
||||
#
|
||||
# :api: plugin
|
||||
def render_to_body(options = {})
|
||||
name = options[:_template_name] || action_name
|
||||
|
||||
|
||||
template = options[:_template] || view_paths.find_by_parts(name.to_s, {:formats => formats}, options[:_prefix])
|
||||
_render_template(template, options)
|
||||
end
|
||||
|
@ -39,7 +39,7 @@ module AbstractController
|
|||
# ====
|
||||
# @option _prefix<String> The template's path prefix
|
||||
# @option _layout<String> The relative path to the layout template to use
|
||||
#
|
||||
#
|
||||
# :api: plugin
|
||||
def render_to_string(options = {})
|
||||
AbstractController::Renderer.body_to_s(render_to_body(options))
|
||||
|
@ -48,7 +48,7 @@ module AbstractController
|
|||
def _render_template(template, options)
|
||||
_action_view._render_template_with_layout(template)
|
||||
end
|
||||
|
||||
|
||||
def view_paths() _view_paths end
|
||||
|
||||
# Return a string representation of a Rack-compatible response body.
|
||||
|
@ -64,14 +64,15 @@ module AbstractController
|
|||
end
|
||||
|
||||
module ClassMethods
|
||||
|
||||
def append_view_path(path)
|
||||
self.view_paths << path
|
||||
end
|
||||
|
||||
|
||||
def view_paths
|
||||
self._view_paths
|
||||
end
|
||||
|
||||
|
||||
def view_paths=(paths)
|
||||
self._view_paths = paths.is_a?(ActionView::PathSet) ?
|
||||
paths : ActionView::Base.process_view_paths(paths)
|
||||
|
|
|
@ -4,4 +4,4 @@ module ActionController
|
|||
autoload :Layouts, "action_controller/new_base/layouts"
|
||||
autoload :Renderer, "action_controller/new_base/renderer"
|
||||
autoload :UrlFor, "action_controller/new_base/url_for"
|
||||
end
|
||||
end
|
|
@ -1,5 +1,6 @@
|
|||
module ActionController
|
||||
class AbstractBase < AbstractController::Base
|
||||
|
||||
# :api: public
|
||||
attr_internal :request, :response, :params
|
||||
|
||||
|
@ -11,46 +12,46 @@ module ActionController
|
|||
# :api: public
|
||||
def controller_name() self.class.controller_name end
|
||||
|
||||
# :api: public
|
||||
# :api: public
|
||||
def self.controller_path
|
||||
@controller_path ||= self.name.sub(/Controller$/, '').underscore
|
||||
end
|
||||
|
||||
# :api: public
|
||||
|
||||
# :api: public
|
||||
def controller_path() self.class.controller_path end
|
||||
|
||||
# :api: private
|
||||
|
||||
# :api: private
|
||||
def self.action_methods
|
||||
@action_names ||= Set.new(self.public_instance_methods - self::CORE_METHODS)
|
||||
end
|
||||
|
||||
# :api: private
|
||||
|
||||
# :api: private
|
||||
def self.action_names() action_methods end
|
||||
|
||||
# :api: private
|
||||
|
||||
# :api: private
|
||||
def action_methods() self.class.action_names end
|
||||
|
||||
# :api: private
|
||||
def action_names() action_methods end
|
||||
|
||||
|
||||
# :api: plugin
|
||||
def self.call(env)
|
||||
controller = new
|
||||
controller.call(env).to_rack
|
||||
end
|
||||
|
||||
|
||||
# :api: plugin
|
||||
def response_body=(body)
|
||||
@_response.body = body
|
||||
end
|
||||
|
||||
|
||||
# :api: private
|
||||
def call(env)
|
||||
@_request = ActionDispatch::Request.new(env)
|
||||
@_response = ActionDispatch::Response.new
|
||||
process(@_request.parameters[:action])
|
||||
end
|
||||
|
||||
|
||||
# :api: private
|
||||
def to_rack
|
||||
response.to_a
|
||||
|
|
|
@ -6,20 +6,21 @@ module ActionController
|
|||
end
|
||||
|
||||
def action_methods() self.class.action_names end
|
||||
def action_names() action_methods end
|
||||
|
||||
def action_names() action_methods end
|
||||
|
||||
private
|
||||
|
||||
def respond_to_action?(action_name)
|
||||
!hidden_actions.include?(action_name) && (super || respond_to?(:method_missing))
|
||||
end
|
||||
|
||||
|
||||
module ClassMethods
|
||||
def hide_action(*args)
|
||||
args.each do |arg|
|
||||
self.hidden_actions << arg.to_s
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def action_methods
|
||||
@action_names ||= Set.new(super.reject {|name| self.hidden_actions.include?(name.to_s)})
|
||||
end
|
||||
|
@ -27,4 +28,4 @@ module ActionController
|
|||
def self.action_names() action_methods end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -4,13 +4,13 @@ module ActionController
|
|||
|
||||
depends_on ActionController::Renderer
|
||||
depends_on AbstractController::Layouts
|
||||
|
||||
|
||||
module ClassMethods
|
||||
def _implied_layout_name
|
||||
controller_path
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def render_to_body(options)
|
||||
# render :text => ..., :layout => ...
|
||||
# or
|
||||
|
@ -18,20 +18,22 @@ module ActionController
|
|||
if !options.key?(:text) || options.key?(:layout)
|
||||
options[:_layout] = options.key?(:layout) ? _layout_for_option(options[:layout]) : _default_layout
|
||||
end
|
||||
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def _layout_for_option(name)
|
||||
case name
|
||||
when String then _layout_for_name(name)
|
||||
when true then _default_layout(true)
|
||||
when false, nil then nil
|
||||
else
|
||||
raise ArgumentError,
|
||||
"String, true, or false, expected for `layout'; you passed #{name.inspect}"
|
||||
raise ArgumentError,
|
||||
"String, true, or false, expected for `layout'; you passed #{name.inspect}"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,22 +3,22 @@ module ActionController
|
|||
extend ActiveSupport::DependencyModule
|
||||
|
||||
depends_on AbstractController::Renderer
|
||||
|
||||
|
||||
def initialize(*)
|
||||
self.formats = [:html]
|
||||
super
|
||||
end
|
||||
|
||||
|
||||
def render(action, options = {})
|
||||
# TODO: Move this into #render_to_body
|
||||
if action.is_a?(Hash)
|
||||
options, action = action, nil
|
||||
options, action = action, nil
|
||||
else
|
||||
options.merge! :action => action
|
||||
end
|
||||
|
||||
|
||||
_process_options(options)
|
||||
|
||||
|
||||
self.response_body = render_to_body(options)
|
||||
end
|
||||
|
||||
|
@ -34,17 +34,18 @@ module ActionController
|
|||
options[:_template_name] = options[:template]
|
||||
elsif options.key?(:action)
|
||||
options[:_template_name] = options[:action].to_s
|
||||
options[:_prefix] = _prefix
|
||||
options[:_prefix] = _prefix
|
||||
end
|
||||
|
||||
|
||||
super(options)
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def _prefix
|
||||
controller_path
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
def _text(options)
|
||||
text = options[:text]
|
||||
|
||||
|
@ -53,7 +54,7 @@ module ActionController
|
|||
else text.to_s
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def _process_options(options)
|
||||
if status = options[:status]
|
||||
response.status = status.to_i
|
||||
|
|
|
@ -16,7 +16,7 @@ module ActionController
|
|||
# by this method.
|
||||
def default_url_options(options = nil)
|
||||
end
|
||||
|
||||
|
||||
def rewrite_options(options) #:nodoc:
|
||||
if defaults = default_url_options(options)
|
||||
defaults.merge(options)
|
||||
|
@ -24,7 +24,7 @@ module ActionController
|
|||
options
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def url_for(options = {})
|
||||
options ||= {}
|
||||
case options
|
||||
|
@ -37,4 +37,4 @@ module ActionController
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue