Class: Flame::Controller

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/flame/controller.rb

Overview

Class initialize when Dispatcher found route with it For new request and response

Defined Under Namespace

Modules: ModuleActions, ParentActions

Constant Summary collapse

FORBIDDEN_ACTIONS =
[].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dispatcher) ⇒ Controller

Initialize the controller for request execution

Parameters:



27
28
29
# File 'lib/flame/controller.rb', line 27

def initialize(dispatcher)
	@dispatcher = dispatcher
end

Class Method Details

.actionsObject

Shortcut for not-inherited public methods: actions



15
16
17
# File 'lib/flame/controller.rb', line 15

def self.actions
	public_instance_methods(false)
end

.default_pathObject

Default root path of the controller for requests



176
177
178
179
180
181
182
183
# File 'lib/flame/controller.rb', line 176

def default_path
	modules = underscore.split('/')
	parts = modules.pop.split('_')
	parts.shift if parts.first == 'index'
	parts.pop if %w[controller ctrl].include? parts.last
	parts = [modules.last] if parts.empty?
	Flame::Path.merge nil, parts.join('_')
end

.with_actions(mod = nil) ⇒ Object

Re-define public instance method from parent

Examples:

Inherit controller with parent actions by method

class MyController < BaseController.with_actions
end

Define actions from module in controller

class MyController < BaseController
  include with_actions Module1
  include with_actions Module2
  ....
end


195
196
197
198
# File 'lib/flame/controller.rb', line 195

def with_actions(mod = nil)
	return mod.extend(ModuleActions) if mod
	@with_actions ||= Class.new(self) { extend ParentActions }
end

Instance Method Details

#attachment(filename = nil, disposition = :attachment) ⇒ Object

Set the Content-Disposition to “attachment” with the specified filename, instructing the user agents to prompt to save, and set Content-Type by filename.

Examples:

Set Content-Disposition header without filename

attachment

Set Content-Disposition header with filename and Content-Type

attachment 'style.css'

Parameters:

  • filename (String, nil) (defaults to: nil)

    filename of attachment

  • disposition (Symbol, String) (defaults to: :attachment)

    main content for Content-Disposition



97
98
99
100
101
102
103
104
# File 'lib/flame/controller.rb', line 97

def attachment(filename = nil, disposition = :attachment)
	content_dis = 'Content-Disposition'
	response[content_dis] = disposition.to_s
	return unless filename
	response[content_dis] << "; filename=\"#{File.basename(filename)}\""
	ext = File.extname(filename)
	response.content_type = ext unless ext.empty?
end

#path_to(*args) ⇒ Object

Helpers



32
33
34
35
# File 'lib/flame/controller.rb', line 32

def path_to(*args)
	add_controller_class(args)
	@dispatcher.path_to(*args)
end

#redirect(path, status) ⇒ nil #redirect(uri, status) ⇒ nil #redirect(*args, status) ⇒ nil

Redirect for response

Overloads:

  • #redirect(path, status) ⇒ nil

    Redirect to the string path

    Examples:

    Redirect to ‘/hello’

    redirect '/hello'

    Redirect to ‘/hello’ with status 301

    redirect '/hello', 301

    Parameters:

    • path (String)

      path

    • status (Ingeter, nil)

      HTTP status

    Returns:

    • (nil)
  • #redirect(uri, status) ⇒ nil

    Redirect to the URI location

    Examples:

    Redirect to ‘example.com

    redirect URI::HTTP.build(host: 'example.com')

    Redirect to ‘example.com’ with status 301

    redirect URI::HTTP.build(host: 'example.com'), 301

    Parameters:

    • uri (URI)

      URI object

    • status (Ingeter, nil)

      HTTP status

    Returns:

    • (nil)
  • #redirect(*args, status) ⇒ nil

    Redirect to the path of ‘path_to` method

    Examples:

    Redirect to ‘show` method of `ArticlesController` with id = 2

    redirect ArticlesController, :show, id: 2

    Redirect to method of controller with status 301

    redirect ArticlesController, :show, { id: 2 }, 301

    Parameters:

    • args

      arguments for ‘path_to` method

    • status (Ingeter, nil)

      HTTP status

    Returns:

    • (nil)


78
79
80
81
82
83
84
85
86
# File 'lib/flame/controller.rb', line 78

def redirect(*args)
	args[0] = args.first.to_s if args.first.is_a? URI
	unless args.first.is_a? String
		path_to_args_range = 0..(args.last.is_a?(Integer) ? -2 : -1)
		args[path_to_args_range] = path_to(*args[path_to_args_range])
	end
	response.redirect(*args)
	status
end

#url_to(*args, **options) ⇒ Object

Build a URI to the given controller and action, or path



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/flame/controller.rb', line 38

def url_to(*args, **options)
	first_arg = args.first
	path =
		if first_arg.is_a?(String) || first_arg.is_a?(Flame::Path)
			static_file = find_static(first_arg)
			static_file.path(with_version: options[:version])
		else
			path_to(*args, **options)
		end
	"#{request.scheme}://#{request.host_with_port}#{path}"
end

#view(path = nil, options = {}) ⇒ String Also known as: render

Render a template with ‘Flame::Render` (based on Tilt-engine)

Parameters:

  • path (Symbol, nil) (defaults to: nil)

    path to the template file

  • options (Hash) (defaults to: {})

    options for the ‘Flame::Render` rendering

Returns:

  • (String)

    rendered template



110
111
112
113
114
115
116
117
118
119
# File 'lib/flame/controller.rb', line 110

def view(path = nil, options = {})
	cache = options.delete(:cache)
	cache = config[:environment] == 'production' if cache.nil?
	template = Flame::Render.new(
		self,
		(path || caller_locations(1, 1)[0].label.to_sym),
		options
	)
	template.render(cache: cache)
end