Class: Merb::Controller

Inherits:
AbstractController
  • Object
show all
Includes:
AuthenticationMixin, ControllerMixin, ResponderMixin
Defined in:
lib/merb-core/controller/merb_controller.rb

Constant Summary

Constants included from ResponderMixin

ResponderMixin::MIMES, ResponderMixin::TYPES

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AuthenticationMixin

#basic_authentication

Methods included from ControllerMixin

#delete_cookie, #escape_xml, #message, #nginx_send_file, #redirect, #render_chunked, #render_deferred, #render_then_call, #run_later, #send_chunk, #send_data, #send_file, #set_cookie, #stream_file

Methods included from ResponderMixin

#_perform_content_negotiation, #_provided_formats, #content_type, #content_type=, #does_not_provide, included, #only_provides, #provides

Constructor Details

#initialize(request, status = 200, headers = {'Content-Type' => 'text/html; charset=utf-8'}) ⇒ Controller

Build a new controller.

Sets the variables that came in through the dispatch as available to the controller.

This method uses the :session_id_cookie_only and :query_string_whitelist configuration options. See CONFIG for more details.

Parameters

request<Merb::Request>

The Merb::Request that came in from Mongrel.

status<Integer>

An integer code for the status. Defaults to 200.

headers<Hash=> value>

A hash of headers to start the controller with. These headers can be overridden later by the #headers method.




177
178
179
180
# File 'lib/merb-core/controller/merb_controller.rb', line 177

def initialize(request, status=200, headers={'Content-Type' => 'text/html; charset=utf-8'})
  super()
  @request, @_status, @headers = request, status, headers
end

Instance Attribute Details

#headersObject (readonly)

Returns the value of attribute headers.



204
205
206
# File 'lib/merb-core/controller/merb_controller.rb', line 204

def headers
  @headers
end

#requestObject (readonly)

Returns the value of attribute request.



204
205
206
# File 'lib/merb-core/controller/merb_controller.rb', line 204

def request
  @request
end

#routeObject

Returns the value of attribute route.



21
22
23
# File 'lib/merb-core/controller/merb_controller.rb', line 21

def route
  @route
end

Class Method Details

._filter_params(params) ⇒ Object

This is a stub method so plugins can implement param filtering if they want.

Parameters

params<Hash=> String>

A list of params

Returns

Hash=> String

A new list of params, filtered as desired




100
101
102
# File 'lib/merb-core/controller/merb_controller.rb', line 100

def _filter_params(params)
  params
end

.callable_actionsObject

The list of actions that are callable, after taking defaults, _hidden_actions and _shown_actions into consideration. It is calculated once, the first time an action is dispatched for this controller.

Returns

SimpleSet

A set of actions that should be callable.



87
88
89
# File 'lib/merb-core/controller/merb_controller.rb', line 87

def callable_actions
  @callable_actions ||= Extlib::SimpleSet.new(_callable_methods)
end

.hide_action(*names) ⇒ Object

Hide each of the given methods from being callable as actions.

Parameters

*names<~to-s>

Actions that should be added to the list.

Returns

Array

An array of actions that should not be possible to dispatch to.




45
46
47
# File 'lib/merb-core/controller/merb_controller.rb', line 45

def hide_action(*names)
  self._hidden_actions = self._hidden_actions | names.map { |n| n.to_s }
end

.inherited(klass) ⇒ Object

Parameters

klass<Merb::Controller>

The Merb::Controller inheriting from the base class.



28
29
30
31
32
# File 'lib/merb-core/controller/merb_controller.rb', line 28

def inherited(klass)
  _subclasses << klass.to_s
  super
  klass._template_root = Merb.dir_for(:view) unless self._template_root
end

.show_action(*names) ⇒ Object

Makes each of the given methods being callable as actions. You can use this to make methods included from modules callable as actions.

Parameters

*names<~to-s>

Actions that should be added to the list.

Returns

Array

An array of actions that should be dispatched to even if they would not otherwise be.

Example

module Foo
  def self.included(base)
    base.show_action(:foo)
  end

  def foo
    # some actiony stuff
  end

  def foo_helper
    # this should not be an action
  end
end



77
78
79
# File 'lib/merb-core/controller/merb_controller.rb', line 77

def show_action(*names)
  self._shown_actions = self._shown_actions | names.map {|n| n.to_s}
end

.subclasses_listObject



10
# File 'lib/merb-core/controller/merb_controller.rb', line 10

def self.subclasses_list() _subclasses end

Instance Method Details

#_absolute_template_location(template, type) ⇒ Object

The location to look for a template and mime-type. This is overridden from AbstractController, which defines a version of this that does not involve mime-types.

Parameters

template<String>

The absolute path to a template - without mime and template extension. The mime-type extension is optional - it will be appended from the current content type if it hasn’t been added already.

type<~to_s>

The mime-type of the template that will be rendered. Defaults to nil.



157
158
159
# File 'lib/merb-core/controller/merb_controller.rb', line 157

def _absolute_template_location(template, type)
  _conditionally_append_extension(template, type)
end

#_dispatch(action = :index) ⇒ Object

Dispatch the action.

Parameters

action<~to_s>

An action to dispatch to. Defaults to :index.

Returns

String

The string sent to the logger for time spent.

Raises

ActionNotFound

The requested action was not found in class.




194
195
196
197
198
199
200
201
202
# File 'lib/merb-core/controller/merb_controller.rb', line 194

def _dispatch(action=:index)
  start = Time.now
  if self.class.callable_actions.include?(action.to_s)
    super(action)
  else
    raise ActionNotFound, "Action '#{action}' was not found in #{self.class}"
  end
  @_benchmarks[:action_time] = Time.now - start
end

#_template_location(context, type = nil, controller = controller_name) ⇒ Object

The location to look for a template for a particular controller, context, and mime-type. This is overridden from AbstractController, which defines a version of this that does not involve mime-types.

Parameters

context<~to_s>

The name of the action or template basename that will be rendered.

type<~to_s>

The mime-type of the template that will be rendered. Defaults to nil.

controller<~to_s>

The name of the controller that will be rendered. Defaults to controller_name.

Notes

By default, this renders “:controller/:action.:type”. To change this, override it in your application class or in individual controllers.




140
141
142
# File 'lib/merb-core/controller/merb_controller.rb', line 140

def _template_location(context, type = nil, controller = controller_name)
  _conditionally_append_extension(controller ? "#{controller}/#{context}" : "#{context}", type)
end

#cookiesObject

Returns

Merb::Cookies

A new Merb::Cookies instance representing the cookies that came in from the request object

Notes

Headers are passed into the cookie object so that you can do:

cookies[:foo] = "bar"


236
# File 'lib/merb-core/controller/merb_controller.rb', line 236

def cookies() @_cookies ||= _setup_cookies end

#paramsObject

Returns

Hash

The parameters from the request object



226
# File 'lib/merb-core/controller/merb_controller.rb', line 226

def params()  request.params  end

#sessionObject

Returns

Hash

The session that was extracted from the request object.



240
# File 'lib/merb-core/controller/merb_controller.rb', line 240

def session() request.session end

#statusObject



206
207
208
# File 'lib/merb-core/controller/merb_controller.rb', line 206

def status
  @_status
end

#status=(s) ⇒ Object

Set the response status code.

Parameters

s<Fixnum, Symbol>

A status-code or named http-status



214
215
216
217
218
219
220
221
222
# File 'lib/merb-core/controller/merb_controller.rb', line 214

def status=(s)
  if s.is_a?(Symbol) && STATUS_CODES.key?(s)
    @_status = STATUS_CODES[s]
  elsif s.is_a?(Fixnum)
    @_status = s
  else
    raise ArgumentError, "Status should be of type Fixnum or Symbol, was #{s.class}"
  end
end