Class: Unpoly::Rails::Inspector

Inherits:
Object
  • Object
show all
Defined in:
lib/unpoly/rails/inspector.rb

Overview

This object allows the server to inspect the current request for Unpoly-related concerns such as "is this a page fragment update?".

Available through the #up method in all controllers, helpers and views.

Instance Method Summary collapse

Constructor Details

#initialize(controller) ⇒ Inspector

Returns a new instance of Inspector.



10
11
12
# File 'lib/unpoly/rails/inspector.rb', line 10

def initialize(controller)
  @controller = controller
end

Instance Method Details

#targetObject

If the current request is a fragment update, this returns the CSS selector of the page fragment that should be updated.

The Unpoly frontend will expect an HTML response containing an element that matches this selector. If no such element is found, an error is shown to the user.

Server-side code is free to optimize its response by only returning HTML that matches this selector.



34
35
36
# File 'lib/unpoly/rails/inspector.rb', line 34

def target
  request.headers['X-Up-Target']
end

#target?(tested_target) ⇒ Boolean

Tests whether the given CSS selector is targeted by the current fragment update.

Note that the matching logic is very simplistic and does not actually know how your page layout is structured. It will return true if the tested selector and the requested CSS selector matches exactly, or if the requested selector is body or html.

Always returns true if the current request is not an Unpoly fragment update.

Returns:

  • (Boolean)


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/unpoly/rails/inspector.rb', line 47

def target?(tested_target)
  if up?
    actual_target = target
    if actual_target == tested_target
      true
    elsif actual_target == 'html'
      true
    elsif actual_target == 'body'
      not ['head', 'title', 'meta'].include?(tested_target)
    else
      false
    end
  else
    true
  end
end

#title=(new_title) ⇒ Object

Forces Unpoly to use the given string as the document title when processing this response.

This is useful when you skip rendering the <head> in an Unpoly request.



84
85
86
# File 'lib/unpoly/rails/inspector.rb', line 84

def title=(new_title)
  response.headers['X-Up-Title'] = new_title
end

#up?Boolean Also known as: unpoly?

Returns whether the current request is an page fragment update triggered by an Unpoly frontend.

Returns:

  • (Boolean)


18
19
20
# File 'lib/unpoly/rails/inspector.rb', line 18

def up?
  target.present?
end

#validate?Boolean

Returns whether the current form submission should be validated (and not be saved to the database).

Returns:

  • (Boolean)


67
68
69
# File 'lib/unpoly/rails/inspector.rb', line 67

def validate?
  validate_name.present?
end

#validate_nameObject

If the current form submission is a validation, this returns the name attribute of the form field that has triggered the validation.



75
76
77
# File 'lib/unpoly/rails/inspector.rb', line 75

def validate_name
  request.headers['X-Up-Validate']
end