Class: Rango::Controller

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Exceptions, UrlHelper
Defined in:
lib/rango/controller.rb

Direct Known Subclasses

StackController

Constant Summary

Constants included from Exceptions

Exceptions::ActionNotFound, Exceptions::ClientError, Exceptions::Error100, Exceptions::Error101, Exceptions::Error200, Exceptions::Error201, Exceptions::Error202, Exceptions::Error203, Exceptions::Error204, Exceptions::Error205, Exceptions::Error206, Exceptions::Error300, Exceptions::Error301, Exceptions::Error302, Exceptions::Error303, Exceptions::Error304, Exceptions::Error305, Exceptions::Error307, Exceptions::Error400, Exceptions::Error401, Exceptions::Error402, Exceptions::Error403, Exceptions::Error404, Exceptions::Error405, Exceptions::Error406, Exceptions::Error407, Exceptions::Error408, Exceptions::Error409, Exceptions::Error410, Exceptions::Error411, Exceptions::Error412, Exceptions::Error413, Exceptions::Error414, Exceptions::Error415, Exceptions::Error416, Exceptions::Error417, Exceptions::Error500, Exceptions::Error501, Exceptions::Error502, Exceptions::Error503, Exceptions::Error504, Exceptions::Error505, Exceptions::Informational, Exceptions::MultiPartParseError, Exceptions::ServerError, Exceptions::Successful, Exceptions::TemplateNotFound

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from UrlHelper

#crudtree_generator, #resource, #url

Constructor Details

#initialize(env) ⇒ Controller

Returns a new instance of Controller.



107
108
109
# File 'lib/rango/controller.rb', line 107

def initialize(env)
  @env = env
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



106
107
108
# File 'lib/rango/controller.rb', line 106

def env
  @env
end

Class Method Details

.call(env) ⇒ Object

master

Change Merb::Controller to respond to #call and return a Rack Array. (wycats)rubyurl.com/BhoY

Since:

  • 0.0.2



27
28
29
30
31
# File 'lib/rango/controller.rb', line 27

def self.call(env)
  Rango::Router.set_rack_env(env) # TODO: this shouldn't require router stuff, it might emit an event
  controller = self.new(env)
  controller.to_response
end

.dispatcher(action) ⇒ Object

for routers



17
18
19
20
21
22
23
# File 'lib/rango/controller.rb', line 17

def self.dispatcher(action)
  lambda do |env|
    Rango.logger.info("Dispatching to #{self}##{action} [#{env["REQUEST_METHOD"]} #{env["PATH_INFO"]}]")
    env["rango.controller.action"] = action
    return self.call(env)
  end
end

Instance Method Details

#absolute_uri(path) ⇒ Object

absolute_uri “google.com” => “google.com” absolute_uri “/products” => “localhost:4000/products



83
84
85
86
87
88
89
# File 'lib/rango/controller.rb', line 83

def absolute_uri(path)
  if path.match(/^https?:\/{2}/)
    path
  else
    (request.base_url.chomp("/") + path).chomp("/")
  end
end

#actionObject



47
48
49
50
51
# File 'lib/rango/controller.rb', line 47

def action
  env["rango.controller.action"].to_sym
rescue NoMethodError
  raise "You have to setup env['rango.controller.action'] to name of action you want to call"
end

#invoke_action(action) ⇒ Object

default, redefine in plugin if you need to



42
43
44
45
# File 'lib/rango/controller.rb', line 42

def invoke_action(action)
  Rango.logger.debug("Calling method #{self.class.name}##{action} without arguments")
  self.response.body = self.send(action)
end

#logger#debug, ...

Returns Logger for logging project related stuff.

Returns:

  • (#debug, #info, #error, #fatal, #flush, #close)

    Logger for logging project related stuff.

Since:

  • 0.0.1



74
75
76
# File 'lib/rango/controller.rb', line 74

def logger
  Rango.logger
end

#paramsObject



125
126
127
128
129
130
131
# File 'lib/rango/controller.rb', line 125

def params
  @params ||= begin
    params = self.request.params
    params.merge!(self.router_params) if router_params
    params
  end
end

#redirect(location, status = 303, &block) ⇒ String

Returns Escaped URL (which is RFC recommendation).

Returns:

  • (String)

    Escaped URL (which is RFC recommendation)

Since:

  • 0.0.2

Version:

  • 0.2.1



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/rango/controller.rb', line 94

def redirect(location, status = 303, &block)
  if (300..399).include?(status)
    exception = Redirection.new(absolute_uri(location))
    exception.status = status
    exception.headers["Set-Cookie"] = response["Set-Cookie"] # otherwise it don't save cookies
    block.call(exception) unless block.nil?
    raise exception
  else
    raise ArgumentError, "Status has to be between 300 and 399"
  end
end

#render_http_error(exception) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/rango/controller.rb', line 143

def render_http_error(exception)
  exception.headers["Content-Type"] = "text/html"
  if Rango.production?
    <<-EOF
<h1>Application Error</h1>
<p>
  The application you are trying to reach has currently some issues. Please contact our team and tell us about the troubles. Thank you.
</p>
    EOF
  else
    <<-EOF
<h1>#{exception.class}: #{exception.message}</h1>
<ul>
  <li>#{exception.backtrace.join("</li><li>")}</li>
</ul>
    EOF
  end
end

#requestObject



111
112
113
# File 'lib/rango/controller.rb', line 111

def request
  @request ||= Rango::Request.new(env)
end

#rescue_http_error(exception) ⇒ Object

redefine this method for your controller if you want to provide custom error pages returns response array for rack if you need to change just body of error message, define render_http_error method



137
138
139
140
141
# File 'lib/rango/controller.rb', line 137

def rescue_http_error(exception)
  # we need to call it before we assign the variables
  body = self.render_http_error(exception)
  [exception.status, exception.headers, body]
end

#responseObject



115
116
117
# File 'lib/rango/controller.rb', line 115

def response
  @response ||= Rack::Response.new
end

#router_paramsObject



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

def router_params
  @router_params ||= self.env["rango.router.params"]
end

#run_actionObject



33
34
35
36
37
38
39
# File 'lib/rango/controller.rb', line 33

def run_action
  if self.respond_to?(self.action)
    self.invoke_action(self.action)
  else
    raise NotFound, "Controller #{self.class.name} doesn't have method #{self.action}"
  end
end

#to_responseObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/rango/controller.rb', line 53

def to_response
  self.run_action
  #self.response.finish # do we need this?
  [response.status, response.headers, [response.body]] # this way we got real body rather than response object
rescue Redirection => redirection
  redirection.to_response
rescue HttpError => exception
  self.rescue_http_error(exception)
rescue Exception => exception # so we can be sure that all the exceptions which occures in controller can be captured by rescue_http_error method
  if Rango.development? or Rango.testing?
    raise exception
  else
    message = "#{exception.class}: #{exception.message}"
    server_error = InternalServerError.new(message)
    server_error.backtrace = caller
    self.rescue_http_error(server_error)
  end
end