Class: Sidekiq::Web::Action

Inherits:
Object
  • Object
show all
Defined in:
lib/sidekiq/web/action.rb

Overview

These instance methods are available to all executing ERB templates.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env, block) ⇒ Action

Returns a new instance of Action.



13
14
15
16
17
# File 'lib/sidekiq/web/action.rb', line 13

def initialize(env, block)
  @_erb = false
  @env = env
  @block = block
end

Instance Attribute Details

#blockObject

Returns the value of attribute block.



11
12
13
# File 'lib/sidekiq/web/action.rb', line 11

def block
  @block
end

#envObject

Returns the value of attribute env.



11
12
13
# File 'lib/sidekiq/web/action.rb', line 11

def env
  @env
end

Instance Method Details

#configObject



19
20
21
# File 'lib/sidekiq/web/action.rb', line 19

def config
  env[:web_config]
end

#erb(content, options = {}) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/sidekiq/web/action.rb', line 116

def erb(content, options = {})
  if content.is_a? Symbol
    unless respond_to?(:"_erb_#{content}")
      views = options[:views] || Web.views
      filename = "#{views}/#{content}.erb"
      src = ERB.new(File.read(filename)).src

      # Need to use lineno less by 1 because erb generates a
      # comment before the source code.
      Action.class_eval <<-RUBY, filename, -1 # standard:disable Style/EvalWithLocation
        def _erb_#{content}
          #{src}
        end
      RUBY
    end
  end

  if @_erb
    _erb(content, options[:locals])
  else
    @_erb = true
    content = _erb(content, options[:locals])

    _render { content }
  end
end

#flashObject

flash { “Some message to show on redirect” }



102
103
104
105
106
# File 'lib/sidekiq/web/action.rb', line 102

def flash
  msg = yield
  logger.info msg
  session[:flash] = msg
end

#flash?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/sidekiq/web/action.rb', line 108

def flash?
  session&.[](:flash)
end

#get_flashObject



112
113
114
# File 'lib/sidekiq/web/action.rb', line 112

def get_flash
  @flash ||= session.delete(:flash)
end

#halt(res) ⇒ Object



27
28
29
# File 'lib/sidekiq/web/action.rb', line 27

def halt(res)
  throw :halt, [res, {"content-type" => "text/plain"}, [res.to_s]]
end

#header(key, value) ⇒ Object



36
37
38
# File 'lib/sidekiq/web/action.rb', line 36

def header(key, value)
  env["response_headers"][key] = value.to_s
end

#json(payload) ⇒ Object



149
150
151
152
153
# File 'lib/sidekiq/web/action.rb', line 149

def json(payload)
  [200,
    {"content-type" => "application/json", "cache-control" => "private, no-store"},
    [Sidekiq.dump_json(payload)]]
end

#loggerObject



97
98
99
# File 'lib/sidekiq/web/action.rb', line 97

def logger
  Sidekiq.logger
end

#paramsObject



64
65
66
67
# File 'lib/sidekiq/web/action.rb', line 64

def params
  warn { "Direct access to Rack parameters is discouraged, use `url_params` or `route_params` (at #{caller(3..3).first})" }
  request.params
end

#redirect(location) ⇒ Object

internal redirect



41
42
43
# File 'lib/sidekiq/web/action.rb', line 41

def redirect(location)
  throw :halt, [302, {"location" => "#{request.base_url}#{location}"}, []]
end

#redirect_to(url) ⇒ Object

external redirect



32
33
34
# File 'lib/sidekiq/web/action.rb', line 32

def redirect_to(url)
  throw :halt, [302, {"location" => url}, []]
end

#reload_pageObject



45
46
47
48
# File 'lib/sidekiq/web/action.rb', line 45

def reload_page
  current_location = request.referer.gsub(request.base_url, "")
  redirect current_location
end

#render(engine, content, options = {}) ⇒ Object



143
144
145
146
147
# File 'lib/sidekiq/web/action.rb', line 143

def render(engine, content, options = {})
  raise "Only erb templates are supported" if engine != :erb

  erb(content, options)
end

#requestObject



23
24
25
# File 'lib/sidekiq/web/action.rb', line 23

def request
  @request ||= ::Rack::Request.new(env)
end

#route_params(key) ⇒ Object

variables embedded in path, ‘/metrics/:name` uses Symbol keys, no Strings!



59
60
61
62
# File 'lib/sidekiq/web/action.rb', line 59

def route_params(key)
  warn { "Route parameter `#{key}` should be accessed via Symbol, not String (at #{caller(3..3).first})" } if key.is_a?(String)
  env["rack.route_params"][key.to_sym]
end

#sessionObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/sidekiq/web/action.rb', line 69

def session
  env["rack.session"] || fail(<<~EOM)
    Sidekiq::Web needs a valid Rack session. If this is a Rails app, make
    sure you mount Sidekiq::Web *inside* your application routes:


    Rails.application.routes.draw do
      mount Sidekiq::Web => "/sidekiq"
      ....
    end


    If this is a Rails app in API mode, you need to enable sessions.

      https://guides.rubyonrails.org/api_app.html#using-session-middlewares

    If this is a bare Rack app, use a session middleware before Sidekiq::Web:

      # first, use IRB to create a shared secret key for sessions and commit it
      require 'securerandom'; File.open(".session.key", "w") {|f| f.write(SecureRandom.hex(32)) }

      # now use the secret with a session cookie middleware
      use Rack::Session::Cookie, secret: File.read(".session.key"), same_site: true, max_age: 86400
      run Sidekiq::Web

  EOM
end

#url_params(key) ⇒ Object

stuff after ? or form input uses String keys, no Symbols!



52
53
54
55
# File 'lib/sidekiq/web/action.rb', line 52

def url_params(key)
  warn { "URL parameter `#{key}` should be accessed via String, not Symbol (at #{caller(3..3).first})" } if key.is_a?(Symbol)
  request.params[key.to_s]
end