class Innate::Action
Public Class Methods
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.
@param [Hash, to_hash] hash used to seed new Action instance @return [Action] action with the given defaults from hash @api stable @author manveru
# 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
Public Instance Methods
@return [Binding] binding of the instance for this Action @see Innate::Node#binding @api stable @author manveru
# File lib/innate/action.rb, line 42 def binding instance.binding end
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 #render
@return [String] The rendition of all nested calls @see #render Innate::Node#action_found @api stable @author manveru
# File lib/innate/action.rb, line 34 def call Current.actions ? wrap_in_current{ render } : render end
Copy Action#variables as instance variables into the given object. Defaults to copying the variables to self.
@param [Object instance_variable_set] object @return [NilClass] there is no indication of failure or success @see #render @author manveru
# File lib/innate/action.rb, line 73 def copy_variables(object = instance) self.variables.each do |iv, value| object.instance_variable_set("@#{iv}", value) end end
Path to this action, including params, with the mapping of the current controller prepended.
# File lib/innate/action.rb, line 131 def full_path File.join(node.mapping, path) end
# File lib/innate/action.rb, line 113 def layout_view_or_method(name, arg) [:layout, :view].include?(name) ? [arg, nil] : [nil, arg] end
# File lib/innate/action.rb, line 20 def merge!(hash) hash.each_pair{|key, value| send("#{key}=", value) } self end
Try to figure out a sane name for current action.
# File lib/innate/action.rb, line 125 def name File.basename((method || view).to_s).split('.').first end
# File lib/innate/action.rb, line 79 def render self.instance = instance = node.new self.variables[:content] ||= nil instance.wrap_action_call(self) do copy_variables self.method_value = method ? instance.__send__(method, *params) : nil self.view_value = view ? View.read(view) : nil body, content_type = wrap_in_layout{ engine.call(self, view_value || method_value || '') } options[:content_type] ||= content_type body end end
# File lib/innate/action.rb, line 98 def render_in_layout self.view, self.method = layout_view_or_method(*layout) self.options[:is_layout] = true self.params = [] self.layout = self.view_value = nil self.sync_variables(self) body, content_type = yield self.sync_variables(self) self.variables[:content] = body return call, content_type end
Copy the instance variable names and values from given from_action#instance into the Action#variables of the action this method is called on.
@param [Action instance] from_action @return [Action] from_action @see #wrap_in_layout @api unstable @author manveru
# File lib/innate/action.rb, line 55 def sync_variables(from_action) instance = from_action.instance instance.instance_variables.each{|variable| name = variable.to_s[1..-1].to_sym self.variables[name] = instance.instance_variable_get(variable) } from_action end
# File lib/innate/action.rb, line 135 def valid? node.needs_method? ? (method && view) : (method || view) end
# File lib/innate/action.rb, line 117 def wrap_in_current Current.actions << self yield ensure Current.actions.delete(self) end
# File lib/innate/action.rb, line 94 def wrap_in_layout layout ? dup.render_in_layout(&Proc.new) : yield end