./lib/lux/cell/cell.rb in lux-fw-0.1.35 vs ./lib/lux/cell/cell.rb in lux-fw-0.2.1

- old
+ new

@@ -12,124 +12,118 @@ # define helper contest, by defult derived from class name ClassAttributes.define self, :helper # before and after any action filter, ignored in cells, after is called just before render - BeforeAndAfter.define self, :before, :before_action, :before_render, :after + ClassCallbacks.define self, :before, :before_action, :before_render, :after class << self # class call method, should not be overridden def call - Lux.page.files_in_use.push "app/cells/#{self.to_s.underscore}.rb" + Lux.current.files_in_use.push "app/cells/#{self.to_s.underscore}.rb" cell = new cell.filter :before cell.call - return if Lux.page.body + return if Lux.current.response.body # we want to exec filter after the call cell.filter :before_action end # create mock function, to enable template rendering # mock :index, :login def mock *args - for el in args - # class_eval %[def #{el}(*args); true; end] + args.each do |el| define_method el do true end end end # simple shortcut allows direct call to action, bypasing call - def action name, object=nil - object.present? ? new.action(name, object) : new.action(name) + def action *args + new.action(*args) end - - # for use in helpers, mostly - # renders only cell without layout - # = cell :tag_list, object - def cell name, *args - c = new - c.instance_variable_set '@cell_action', name - c.instance_variable_set '@no_render', true - c.send name, *args - c.render_part - end end ### INSTANCE METHODS attr_reader :cell_action def initialize # before and after should be exected only once @executed_filters = {} - @base_template = self.class.to_s.index('::') ? self.class.to_s.sub(/Cell$/,'').underscore : self.class.to_s.sub(/Cell$/,'').downcase + @base_template = self.class.to_s.include?('::') ? self.class.to_s.sub(/Cell$/,'').underscore : self.class.to_s.sub(/Cell$/,'').downcase end # default call method, should be overitten # expects arguments as flat array # usually called by router def call action(:index) end + # execute before and after filters, only once def filter fiter_name + # move this to ClassCallbacks class? return if @executed_filters[fiter_name] @executed_filters[fiter_name] = true - BeforeAndAfter.execute(self, fiter_name) + ClassCallbacks.execute(self, fiter_name) end + def cache *args, &block + Lux.cache.fetch *args, &block + end + # action(:show, 2) # action(:select', ['users']) def action method_name, *args raise ArgumentError.new('Cell action called with blank action name argument') if method_name.blank? # maybe before filter rendered page - return if Lux.page.body + return if response.body method_name = method_name.to_s.gsub('-', '_').gsub(/[^\w]/, '') Lux.log " #{self.class.to_s}(:#{method_name})".light_blue - Lux.page.files_in_use.push "app/cells/#{self.class.to_s.underscore}.rb" + Lux.current.files_in_use.push "app/cells/#{self.class.to_s.underscore}.rb" @cell_action = method_name unless respond_to? method_name - raise NotFoundError.new('Method %s not found' % method_name) unless Lux.verbose? + raise NotFoundError.new('Method %s not found' % method_name) unless Lux.config(:show_server_errors) list = methods - Lux::Cell.instance_methods err = [%[No instance method "#{method_name}" found in class "#{self.class.to_s}"]] err.push ["Expected so see def show(id) ..."] if method_name == 'show!' err.push %[You have defined \n- #{(list).join("\n- ")}] return Lux.error(err.join("\n\n")) end filter :before - return if Lux.page.body + return if response.body filter :before_action - return if Lux.page.body + return if response.body send method_name, *args filter :after - return if Lux.page.body + return if response.body render end # render :show, id # render :index # render 'main/root/index' # render :profile, name:'Dux' # render text: 'ok' def render name=nil, opts={} - return if Lux.page.body + return if response.body return if @no_render filter :before_render if name.is_hash? @@ -137,12 +131,13 @@ name = nil end opts[:template] = name if name - render_resolve_body(opts) - Lux.cache.set(opts[:cache], Lux.page.body) if opts[:cache] + render_resolve_body opts + + Lux.cache.set(opts[:cache], response.body) if opts[:cache] end # renders template to string def render_part Lux::Template.render_part("#{@base_template}/#{@cell_action}", instance_variables_hash, namespace) @@ -160,40 +155,40 @@ private # called be render def render_resolve_body opts # resolve basic types if opts[:text] - Lux.page.content_type = 'text/plain' - return Lux.page.body(opts[:text]) + response.content_type = 'text/plain' + return response.body(opts[:text]) elsif opts[:html] - Lux.page.content_type = 'text/html' - return Lux.page.body(opts[:html]) + response.content_type = 'text/html' + return response.body(opts[:html]) elsif opts[:json] - Lux.page.content_type = 'application/json' - return Lux.page.body(opts[:json]) + response.content_type = 'application/json' + return response.body(opts[:json]) end - ivh = instance_variables_hash - # resolve page data, without template page_data = opts[:data] || Proc.new do if template = opts.delete(:template) template = template.to_s template = "#{@base_template}/#{template}" unless template.starts_with?('/') else template = "#{@base_template}/#{@cell_action}" end - Lux::Template.render_part(template, ivh, self.class.helper) + Lux::Template.render_part(template, helper) end.call # resolve data with layout layout = opts.delete(:layout) layout = nil if layout.class == TrueClass layout = false if @layout.class == FalseClass + if layout.class != FalseClass - layout_define = self.class.layout + layout_define = layout || self.class.layout + layout = case layout_define when String layout = layout_define when Symbol send(layout_define) @@ -201,49 +196,66 @@ layout_define.call else "#{@base_template.split('/')[0]}/layout" end - page_data = Lux::Template.new(layout, instance_variables_hash, self.class.helper).render_part do + page_data = Lux::Template.new(layout, helper).render_part do page_data end end - Lux.page.body(page_data) unless opts[:set_page_body].is_false? + response.body(page_data) unless opts[:set_page_body].is_false? + page_data end - # helper functions - def page - Lux.page + def etag *args + response.etag *args end - def params - Lux.page.params + def halt status, desc=nil + response.status = status + response.body = desc || "Hatlt code #{status}" + + throw :done end - def nav - Lux.page.nav + # helper functions + def current + Lux.current end def request - Lux.page.request + Lux.current.request end + def response + Lux.current.response + end + + def params + Lux.current.params + end + + def nav + Lux.current.nav + end + def redirect where, flash={} - Lux.page.redirect where, flash + Lux.current.redirect where, flash end def session - Lux.page.session + Lux.current.session end def namespace @base_template.split('/')[0].to_sym end - def helper(ns=nil) - Lux::Helper.for(ns || namespace) + def helper ns=nil + Lux::Helper.new self, :html, self.class.helper, ns end - end + +ApplicationCell = Class.new Lux::Cell