Module: Happy::Controller::Actions

Included in:
Happy::Controller
Defined in:
lib/happy/controller/actions.rb

Instance Method Summary collapse

Instance Method Details

#cache_control(s) ⇒ Object


70
71
72
# File 'lib/happy/controller/actions.rb', line 70

def cache_control(s)
  header :cache_control, s
end

#content_type(type) ⇒ Object


52
53
54
# File 'lib/happy/controller/actions.rb', line 52

def content_type(type)
  header :content_type, type
end

#halt!(message = :done, what = nil) ⇒ Object


34
35
36
37
38
# File 'lib/happy/controller/actions.rb', line 34

def halt!(message = :done, what = nil)
  only_if_path_matches do
    throw message, what || response
  end
end

#header(name, value) ⇒ Object


74
75
76
77
# File 'lib/happy/controller/actions.rb', line 74

def header(name, value)
  name = name.to_s.dasherize.humanize if name.is_a?(Symbol)
  response[name] = value
end

#layout(name) ⇒ Object


48
49
50
# File 'lib/happy/controller/actions.rb', line 48

def layout(name)
  response.layout = name
end

#max_age(t, options = {}) ⇒ Object


56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/happy/controller/actions.rb', line 56

def max_age(t, options = {})
  options = {
    :public => true,
    :must_revalidate => true
  }.merge(options)

  s = []
  s << 'public' if options[:public]
  s << 'must-revalidate' if options[:must_revalidate]
  s << "max-age=#{t.to_i}"

  cache_control s.join(', ')
end

#only_if_path_matchesObject (private)

Execute the provided block, unless there are still bits of unprocessed path left (which indicates that the current path is not the path the user requested.)


102
103
104
# File 'lib/happy/controller/actions.rb', line 102

def only_if_path_matches
  yield if unprocessed_path.empty?
end

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


40
41
42
43
44
45
46
# File 'lib/happy/controller/actions.rb', line 40

def redirect!(to, status = 302)
  only_if_path_matches do
    header :location, url_for(to)
    response.status = status
    halt!
  end
end

#run(thing, options = {}, &blk) ⇒ Object


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/happy/controller/actions.rb', line 79

def run(thing, options = {}, &blk)
  if thing.is_a?(Class) && thing.ancestors.include?(Happy::Controller)    # Happy controllers!

    thing.new(self, options, &blk).tap do |c|
      c.serve! c.route
    end
  elsif thing.respond_to?(:call)    # Rack apps!

    throw :done, thing.call(request.env)
  elsif thing.respond_to?(:to_s)
    thing.to_s
  else
    raise "Don't know how to run #{thing.inspect} :("
  end
end

#serve!(data, options = {}) ⇒ Object


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/happy/controller/actions.rb', line 4

def serve!(data, options = {})
  only_if_path_matches do
    # Don't serve is data is not a string.
    return unless data.is_a?(String)

    # Mix in default options
    options = {
      :layout => response.layout
    }.merge(options)

    # Add status code from options
    response.status = options.delete(:status) if options.has_key?(:status)

    # Extract layout
    layout = options.delete(:layout)

    # Treat remaining options as headers
    options.each { |k, v| header k, v }

    # Apply layout, if available
    if layout
      data = render(layout) { data }
    end

    # Set response body and finish request
    response.body = [data]
    halt!
  end
end