Class: SideBro::Web::Action

Inherits:
Object
  • Object
show all
Includes:
SideBro::WebHelpers
Defined in:
lib/side_bro/web/action.rb

Constant Summary collapse

VIEWS_PATH =
File.expand_path("../../../web/views", __dir__)
TEMPLATE_CACHE =
{}

Constants included from SideBro::WebHelpers

SideBro::WebHelpers::ACTIVEJOB_WRAPPER, SideBro::WebHelpers::QUEUE_NAME_RE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from SideBro::WebHelpers

#clean_aj_args, #csrf_token, #current_page, #current_path?, #display_args, #format_args_short, #format_memory, #h, #handle_job_action, #job_display_class, #locale, #metrics_enabled?, #number_with_delimiter, #page_slice, #paginate, #query_string, #raw_args, #relative_time, #root_path, #rtl?, #t, #truncate, #validate_queue_name!

Constructor Details

#initialize(env) ⇒ Action

Returns a new instance of Action.



20
21
22
23
24
25
# File 'lib/side_bro/web/action.rb', line 20

def initialize(env)
  @env = env
  @request = Rack::Request.new(env)
  @response = Rack::Response.new
  @response["Content-Type"] = "text/html; charset=utf-8"
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



14
15
16
# File 'lib/side_bro/web/action.rb', line 14

def env
  @env
end

#nonceObject (readonly)

Returns the value of attribute nonce.



14
15
16
# File 'lib/side_bro/web/action.rb', line 14

def nonce
  @nonce
end

#requestObject (readonly)

Returns the value of attribute request.



14
15
16
# File 'lib/side_bro/web/action.rb', line 14

def request
  @request
end

#responseObject (readonly)

Returns the value of attribute response.



14
15
16
# File 'lib/side_bro/web/action.rb', line 14

def response
  @response
end

Instance Method Details

#actionObject



16
17
18
# File 'lib/side_bro/web/action.rb', line 16

def action
  self
end

#erb(template_name) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/side_bro/web/action.rb', line 62

def erb(template_name)
  @nonce = SecureRandom.base64(16)
  env["side_bro.csp_nonce"] = @nonce
  response["Content-Security-Policy"] =
    "default-src 'self'; " \
    "script-src 'nonce-#{@nonce}'; " \
    "style-src 'nonce-#{@nonce}' https://fonts.googleapis.com; " \
    "font-src 'self' https://fonts.gstatic.com; " \
    "img-src 'self' data:; " \
    "connect-src 'self'"
  layout = load_template(:layout)
  content = render_template(template_name)
  response.body = [layout.result_with_hash(content: content, nonce: @nonce, action: self)]
  response.finish
end

#flashObject



38
39
40
# File 'lib/side_bro/web/action.rb', line 38

def flash
  @flash ||= FlashHash.new(session)
end

#halt(*resp) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/side_bro/web/action.rb', line 47

def halt(*resp)
  res = if resp.length == 1 && resp.first.is_a?(Integer)
    Rack::Response.new([], resp.first)
  else
    resp.first
  end
  throw :halt, res.is_a?(Array) ? res : res.finish
end

#json(payload) ⇒ Object



56
57
58
59
60
# File 'lib/side_bro/web/action.rb', line 56

def json(payload)
  response["Content-Type"] = "application/json; charset=utf-8"
  response.body = [JSON.generate(payload)]
  throw :halt, response.finish
end

#paramsObject



27
28
29
30
31
32
# File 'lib/side_bro/web/action.rb', line 27

def params
  @params ||= begin
    route_params = env[SideBro::Web::Router::ROUTE_PARAMS] || {}
    request.params.merge(route_params)
  end
end

#redirect(location) ⇒ Object



42
43
44
45
# File 'lib/side_bro/web/action.rb', line 42

def redirect(location)
  response.redirect(location)
  throw :halt, response.finish
end

#render_partial(name) ⇒ Object



78
79
80
# File 'lib/side_bro/web/action.rb', line 78

def render_partial(name)
  load_template(:"_#{name}").result(binding)
end

#sessionObject



34
35
36
# File 'lib/side_bro/web/action.rb', line 34

def session
  request.session
end