Class: Innate::Action
- Inherits:
-
Struct
- Object
- Struct
- Innate::Action
- Defined in:
- lib/innate/action.rb
Class Method Summary collapse
-
.create(hash = {}) ⇒ Action
Create a new Action instance.
Instance Method Summary collapse
-
#binding ⇒ Binding
Binding of the instance for this Action.
-
#call ⇒ String
Call the Action instance, will insert itself temporarily into Current.actions during the render operation so even in nested calls one can still access all other Action instances.
-
#copy_variables(object) ⇒ NilClass
Copy Action#variables as instance variables into the given object.
-
#full_path ⇒ Object
Path to this action, including params, with the mapping of the current controller prepended.
- #layout_view_or_method(name, arg) ⇒ Object
- #merge!(hash) ⇒ Object
-
#name ⇒ Object
Try to figure out a sane name for current action.
- #render ⇒ Object
-
#sync_variables(from_action) ⇒ Action
Copy the instance variable names and values from given from_action#instance into the Action#variables of the action this method is called on.
- #valid? ⇒ Boolean
- #wrap_in_current ⇒ Object
- #wrap_in_layout ⇒ Object
Class Method Details
.create(hash = {}) ⇒ Action
Create a new Action instance. Note that the default cannot be a constant as assigning the value objects to the struct would modify them and might lead to bugs due to persisting action contents.
15 16 17 18 |
# File 'lib/innate/action.rb', line 15 def self.create(hash = {}) default = {:options => {}, :variables => {}, :params => []} new(*default.merge(hash.to_hash).values_at(*ACTION_MEMBERS)) end |
Instance Method Details
#binding ⇒ Binding
Returns binding of the instance for this Action.
42 43 44 |
# File 'lib/innate/action.rb', line 42 def binding instance.binding end |
#call ⇒ String
Call the Action instance, will insert itself temporarily into Current.actions during the render operation so even in nested calls one can still access all other Action instances. Will initialize the assigned node and call Action#render
34 35 36 |
# File 'lib/innate/action.rb', line 34 def call Current.actions ? wrap_in_current{ render } : render end |
#copy_variables(object) ⇒ NilClass
Copy Action#variables as instance variables into the given object. Defaults to copying the variables to self.
74 75 76 77 78 |
# File 'lib/innate/action.rb', line 74 def copy_variables(object) self.variables.each do |iv, value| object.instance_variable_set("@#{iv}", value) end end |
#full_path ⇒ Object
Path to this action, including params, with the mapping of the current controller prepended.
129 130 131 |
# File 'lib/innate/action.rb', line 129 def full_path File.join(node.mapping, path) end |
#layout_view_or_method(name, arg) ⇒ Object
111 112 113 |
# File 'lib/innate/action.rb', line 111 def layout_view_or_method(name, arg) [:layout, :view].include?(name) ? [arg, nil] : [nil, arg] end |
#merge!(hash) ⇒ Object
20 21 22 23 |
# File 'lib/innate/action.rb', line 20 def merge!(hash) hash.each_pair{|key, value| send("#{key}=", value) } self end |
#name ⇒ Object
Try to figure out a sane name for current action.
123 124 125 |
# File 'lib/innate/action.rb', line 123 def name File.basename((method || view).to_s).split('.').first end |
#render ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/innate/action.rb', line 80 def render self.instance = node.new self.variables[:content] ||= nil instance.wrap_action_call(self) do copy_variables(self.instance) # this might need another position self.method_value = instance.__send__(method, *params) if method self.view_value = View.read(view) if view body, content_type = wrap_in_layout{ engine.call(self, view_value || method_value || '') } [:content_type] ||= content_type if content_type body end end |
#sync_variables(from_action) ⇒ Action
Copy the instance variable names and values from given from_action#instance into the Action#variables of the action this method is called on.
55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/innate/action.rb', line 55 def sync_variables(from_action) instance = from_action.instance instance.instance_variables.each{|iv| iv_value = instance.instance_variable_get(iv) iv_name = iv.to_s[1..-1] self.variables[iv_name.to_sym] = iv_value } from_action end |
#valid? ⇒ Boolean
133 134 135 |
# File 'lib/innate/action.rb', line 133 def valid? node.needs_method? ? (method && view) : (method || view) end |
#wrap_in_current ⇒ Object
115 116 117 118 119 120 |
# File 'lib/innate/action.rb', line 115 def wrap_in_current Current.actions << self yield ensure Current.actions.delete(self) end |
#wrap_in_layout ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/innate/action.rb', line 96 def wrap_in_layout return yield unless layout action = dup action.view, action.method = layout_view_or_method(*layout) action.params = [] action.layout = nil action.view_value = nil action.sync_variables(self) body, content_type = yield action.sync_variables(self) action.variables[:content] = body return action.call, content_type end |