Class: Utopia::Controller::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/utopia/controller/base.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.actionsObject



47
48
49
# File 'lib/utopia/controller/base.rb', line 47

def actions
  @actions ||= Action.new
end

.base_pathObject



26
27
28
# File 'lib/utopia/controller/base.rb', line 26

def self.base_path
  self.const_get(:BASE_PATH)
end

.controllerObject



34
35
36
# File 'lib/utopia/controller/base.rb', line 34

def self.controller
  self.const_get(:CONTROLLER)
end

.direct?(path) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/utopia/controller/base.rb', line 43

def direct?(path)
  path.dirname == uri_path
end

.lookup(path) ⇒ Object



59
60
61
# File 'lib/utopia/controller/base.rb', line 59

def lookup(path)
  possible_actions = actions.select((path - uri_path).components)
end

.on(path, options = {}, &block) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/utopia/controller/base.rb', line 51

def on(path, options = {}, &block)
  if Symbol === path
    path = ['**', path]
  end
  
  actions.define(Path.create(path).components, options, &block)
end

.require_local(path) ⇒ Object



39
40
41
# File 'lib/utopia/controller/base.rb', line 39

def require_local(path)
  require File.join(base_path, path)
end

.uri_pathObject



30
31
32
# File 'lib/utopia/controller/base.rb', line 30

def self.uri_path
  self.const_get(:URI_PATH)
end

Instance Method Details

#call(env) ⇒ Object



101
102
103
# File 'lib/utopia/controller/base.rb', line 101

def call(env)
  self.class.controller.app.call(env)
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.



95
96
97
98
99
# File 'lib/utopia/controller/base.rb', line 95

def copy_instance_variables(from)
  from.instance_variables.each do |name|
    instance_variable_set(name, from.instance_variable_get(name))
  end
end

#fail!(error = :bad_request) ⇒ Object



121
122
123
# File 'lib/utopia/controller/base.rb', line 121

def fail!(error = :bad_request)
  respond! error
end

#ignore!Object



109
110
111
# File 'lib/utopia/controller/base.rb', line 109

def ignore!
  throw :response, nil
end

#lookup(path) ⇒ Object

Given a path, look up all matched actions.



65
66
67
# File 'lib/utopia/controller/base.rb', line 65

def lookup(path)
  self.class.lookup(path)
end

#passthrough(request, path) ⇒ Object

Given a request, call associated actions if at least one exists.



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/utopia/controller/base.rb', line 70

def passthrough(request, path)
  actions = lookup(path)
  
  if actions.size > 0
    variables = request.controller
    controller_clone = self.clone
    
    variables << controller_clone
    
    response = catch(:response) do
      # By default give nothing - i.e. keep on processing:
      actions.each do |action|
        action.invoke!(controller_clone, request, path)
      end and nil
    end
    
    if response
      return controller_clone.respond_with(*response)
    end
  end
  
  return nil
end

#process!(request, 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.



168
169
170
171
# File 'lib/utopia/controller/base.rb', line 168

def process!(request, path)
  # puts "process! #{request} #{path}"
  passthrough(request, path)
end

#redirect!(target, status = 302) ⇒ Object



113
114
115
# File 'lib/utopia/controller/base.rb', line 113

def redirect! (target, status = 302)
  respond! :redirect => target.to_str, :status => status
end

#respond!(*args) ⇒ Object



105
106
107
# File 'lib/utopia/controller/base.rb', line 105

def respond!(*args)
  throw :response, args
end

#respond_with(*args) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/utopia/controller/base.rb', line 129

def respond_with(*args)
  return args[0] if args[0] == nil || Array === args[0]

  status = 200
  options = nil

  if Numeric === args[0] || Symbol === args[0]
    status = args[0]
    options = args[1] || {}
  else
    options = args[0]
    status = options[:status] || status
  end

  status = Utopia::HTTP::STATUS_CODES[status] || status
  headers = options[:headers] || {}

  if options[:type]
    headers['Content-Type'] ||= options[:type]
  end

  if options[:redirect]
    headers["Location"] = options[:redirect]
    status = 302 if status < 300 || status >= 400
  end

  body = []
  if options[:body]
    body = options[:body]
  elsif options[:content]
    body = [options[:content]]
  elsif status >= 300
    body = [Utopia::HTTP::STATUS_DESCRIPTIONS[status] || "Status #{status}"]
  end

  return [status, headers, body]
end

#rewrite!(location) ⇒ Object



117
118
119
# File 'lib/utopia/controller/base.rb', line 117

def rewrite! location
  throw :rewrite, location.to_str
end

#success!(*args) ⇒ Object



125
126
127
# File 'lib/utopia/controller/base.rb', line 125

def success!(*args)
  respond! :success, *args
end