class Wings::Controller

Attributes

env[R]
params[R]
request[R]
response[R]

Public Class Methods

action(act, rp = {}) click to toggle source

Respond to Rack The action will be used like a Rack app

# File lib/wings/controller.rb, line 14
def self.action(act, rp = {})
  proc { |e| self.new(e).dispatch(act, rp) }
end
new(env) click to toggle source
# File lib/wings/controller.rb, line 18
def initialize(env)
  @env     = env
  @request = Rack::Request.new(env)
  @params  = request.params
end

Public Instance Methods

dispatch(action, routing_params = {}) click to toggle source
# File lib/wings/controller.rb, line 24
def dispatch(action, routing_params = {})
  @params.merge!(routing_params)

  self.send(action)

  if response
    [response.status, response.headers, response.body]
  else
    render(action)
  end
end
render(template, **opts) click to toggle source
options for render

locals: local variables status: status code headers: headers

# File lib/wings/controller.rb, line 40
def render(template, **opts)
  raise 'You can only render once!' if @response

  v = View.new(params_for_view(template, opts))
  @response = Rack::Response.new(v.text, v.status, v.headers)
end

Private Instance Methods

controller_name() click to toggle source
# File lib/wings/controller.rb, line 61
def controller_name
  klass = self.class.to_s.gsub(/Controller$/, '')
  Wings.to_underscore klass
end
instance_variable_hash() click to toggle source
# File lib/wings/controller.rb, line 66
def instance_variable_hash
  self.instance_variables.reduce({}) do |memo, var|
    memo[var] = self.instance_variable_get(var)
    memo
  end
end
params_for_view(template, opts = {}) click to toggle source
# File lib/wings/controller.rb, line 49
def params_for_view(template, opts = {})
  {
    env:           env,
    status:        opts[:status],
    headers:       opts[:headers],
    template:      template,
    local_vars:    opts[:locals],
    controller:    controller_name,
    instance_vars: instance_variable_hash,
  }
end