Class: Utopia::Controller::Base
- Inherits:
-
Object
- Object
- Utopia::Controller::Base
- Defined in:
- lib/utopia/controller/base.rb
Overview
The base implementation of a controller class.
Constant Summary collapse
- URI_PATH =
nil
- BASE_PATH =
nil
- CONTROLLER =
nil
Class Method Summary collapse
-
.base_path ⇒ Object
A string which is the full path to the directory which contains the controller.
-
.controller ⇒ Object
The controller middleware itself.
- .direct?(path) ⇒ Boolean
- .freeze ⇒ Object
- .inspect ⇒ Object
- .to_s ⇒ Object
-
.uri_path ⇒ Object
A relative path to the controller directory relative to the controller root directory.
Instance Method Summary collapse
-
#body_for(status, headers, options) ⇒ Object
Generate the body for the given status, headers and options.
-
#call(env) ⇒ Object
Call into the next app as defined by rack.
- #catch_response ⇒ Object
-
#copy_instance_variables(from) ⇒ Object
Copy the instance variables from the previous controller to the next controller (usually only a few).
-
#fail!(error = 400, message = nil) ⇒ Object
Respond with an error which indiciates some kind of failure.
-
#goto!(target, status = 302) ⇒ Object
Controller relative redirect.
-
#ignore! ⇒ Object
This will cause the controller middleware to pass on the request.
- #inspect ⇒ Object
-
#process!(request, relative_path) ⇒ Object
Return nil if this controller didn’t do anything.
-
#redirect!(target, status = 302) ⇒ Object
Request relative redirect.
-
#respond!(response) ⇒ Object
This will cause the middleware to generate a response.
-
#respond?(response) ⇒ Boolean
Respond with the response, but only if it’s not nil.
-
#succeed!(status: 200, headers: {}, type: nil, **options) ⇒ Object
Succeed the request and immediately respond.
- #to_s ⇒ Object
Class Method Details
.base_path ⇒ Object
A string which is the full path to the directory which contains the controller.
19 20 21 |
# File 'lib/utopia/controller/base.rb', line 19 def self.base_path self.const_get(:BASE_PATH) end |
.controller ⇒ Object
The controller middleware itself.
29 30 31 |
# File 'lib/utopia/controller/base.rb', line 29 def self.controller self.const_get(:CONTROLLER) end |
.direct?(path) ⇒ Boolean
60 61 62 |
# File 'lib/utopia/controller/base.rb', line 60 def self.direct?(path) path.dirname == uri_path end |
.freeze ⇒ Object
51 52 53 54 55 56 57 58 |
# File 'lib/utopia/controller/base.rb', line 51 def self.freeze # This ensures that all class variables are frozen. self.instance_variables.each do |name| self.instance_variable_get(name).freeze end super end |
.inspect ⇒ Object
33 34 35 |
# File 'lib/utopia/controller/base.rb', line 33 def self.inspect "#{super}#{self.uri_path}" end |
.to_s ⇒ Object
37 38 39 |
# File 'lib/utopia/controller/base.rb', line 37 def self.to_s self.inspect end |
.uri_path ⇒ Object
A relative path to the controller directory relative to the controller root directory.
24 25 26 |
# File 'lib/utopia/controller/base.rb', line 24 def self.uri_path self.const_get(:URI_PATH) end |
Instance Method Details
#body_for(status, headers, options) ⇒ Object
Generate the body for the given status, headers and options.
136 137 138 139 140 141 142 |
# File 'lib/utopia/controller/base.rb', line 136 def body_for(status, headers, ) if body = [:body] return body elsif content = [:content] return [content] end end |
#call(env) ⇒ Object
Call into the next app as defined by rack.
83 84 85 |
# File 'lib/utopia/controller/base.rb', line 83 def call(env) self.class.controller.app.call(env) end |
#catch_response ⇒ Object
64 65 66 67 68 |
# File 'lib/utopia/controller/base.rb', line 64 def catch_response catch(:response) do yield and nil end end |
#copy_instance_variables(from) ⇒ Object
Copy the instance variables from the previous controller to the next controller (usually only a few). This allows controllers to share effectively the same instance variables while still being separate classes/instances.
76 77 78 79 80 |
# File 'lib/utopia/controller/base.rb', line 76 def copy_instance_variables(from) from.instance_variables.each do |name| self.instance_variable_set(name, from.instance_variable_get(name)) end end |
#fail!(error = 400, message = nil) ⇒ Object
Respond with an error which indiciates some kind of failure.
116 117 118 119 120 121 |
# File 'lib/utopia/controller/base.rb', line 116 def fail!(error = 400, = nil) status = HTTP::Status.new(error, 400...600) ||= status.to_s respond! [status.to_i, {}, []] end |
#goto!(target, status = 302) ⇒ Object
Controller relative redirect.
111 112 113 |
# File 'lib/utopia/controller/base.rb', line 111 def goto!(target, status = 302) redirect! self.class.uri_path + target end |
#ignore! ⇒ Object
This will cause the controller middleware to pass on the request.
98 99 100 |
# File 'lib/utopia/controller/base.rb', line 98 def ignore! throw :response, nil end |
#inspect ⇒ Object
45 46 47 48 49 |
# File 'lib/utopia/controller/base.rb', line 45 def inspect details = self.instance_variables.map{|name| " #{name}=#{self.instance_variable_get(name)}"} "\#<#{self.class}#{details.join}>" end |
#process!(request, relative_path) ⇒ Object
Return nil if this controller didn’t do anything. Request will keep on processing. Return a valid rack response if the controller can do so.
71 72 73 |
# File 'lib/utopia/controller/base.rb', line 71 def process!(request, relative_path) return nil end |
#redirect!(target, status = 302) ⇒ Object
Request relative redirect. Respond with a redirect to the given target.
103 104 105 106 107 108 |
# File 'lib/utopia/controller/base.rb', line 103 def redirect!(target, status = 302) status = HTTP::Status.new(status, 300...400) location = target.to_s respond! [status.to_i, {HTTP::LOCATION => location}, [status.to_s]] end |
#respond!(response) ⇒ Object
This will cause the middleware to generate a response.
88 89 90 |
# File 'lib/utopia/controller/base.rb', line 88 def respond!(response) throw :response, response end |
#respond?(response) ⇒ Boolean
Respond with the response, but only if it’s not nil.
93 94 95 |
# File 'lib/utopia/controller/base.rb', line 93 def respond?(response) respond!(response) if response end |
#succeed!(status: 200, headers: {}, type: nil, **options) ⇒ Object
Succeed the request and immediately respond.
124 125 126 127 128 129 130 131 132 133 |
# File 'lib/utopia/controller/base.rb', line 124 def succeed!(status: 200, headers: {}, type: nil, **) status = HTTP::Status.new(status, 200...300) if type headers[CONTENT_TYPE] = type.to_s end body = body_for(status, headers, ) respond! [status.to_i, headers, body || []] end |
#to_s ⇒ Object
41 42 43 |
# File 'lib/utopia/controller/base.rb', line 41 def to_s "\#<#{self.class}>" end |