Module: ActionView::Helpers::RenderingHelper

Defined in:
lib/active_scaffold/extensions/action_view_rendering.rb

Overview

:nodoc:

Instance Method Summary collapse

Instance Method Details

#render_with_active_scaffold(*args, &block) ⇒ Object

Adds two rendering options.

render :super

This syntax skips all template overrides and goes directly to the provided ActiveScaffold templates. Useful if you want to wrap an existing template. Just call super!

render :active_scaffold => #ActionView::Helpers::RenderingHelper.controllercontroller.to_s, options = {}+

Lets you embed an ActiveScaffold by referencing the controller where it’s configured.

You may specify options for the embedded scaffold. These constraints have three effects:

* the scaffold's only displays records matching the constraint
* all new records created will be assigned the constrained values
* constrained columns will be hidden (they're pretty boring at this point)

You may also specify options for the embedded scaffold. These only do 1/3 of what constraints do (they only limit search results). Any format accepted by ActiveRecord::Base.find is valid.

Defining options lets you completely customize the list title for the embedded scaffold.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/active_scaffold/extensions/action_view_rendering.rb', line 46

def render_with_active_scaffold(*args, &block)
  if args.first == :super
    last_view = view_stack.last || {:view => instance_variable_get(:@virtual_path).split('/').last}
    options = args[1] || {}
    options[:locals] ||= {}
    options[:locals].reverse_merge!(last_view[:locals] || {})
    if last_view[:templates].nil?
      last_view[:templates] = lookup_context.find_all_templates(last_view[:view], last_view[:partial], options[:locals].keys)
      last_view[:templates].shift
    end
    options[:template] = last_view[:templates].shift
    view_stack << last_view
    result = render_without_active_scaffold options
    view_stack.pop
    result
  elsif args.first.is_a? Hash and args.first[:active_scaffold]
    require 'digest/md5'
    options = args.first

    remote_controller = options[:active_scaffold]
    constraints = options[:constraints]
    conditions = options[:conditions]
    eid = Digest::MD5.hexdigest(params[:controller] + remote_controller.to_s + constraints.to_s + conditions.to_s)
    session["as:#{eid}"] = {:constraints => constraints, :conditions => conditions, :list => {:label => args.first[:label]}}
    options[:params] ||= {}
    options[:params].merge! :eid => eid, :embedded => true

    id = "as_#{eid}-embedded"
    url_options = {:controller => remote_controller.to_s, :action => 'index'}.merge(options[:params])

    if controller.respond_to?(:render_component_into_view)
      controller.send(:render_component_into_view, url_options)
    else
      (:div, :id => id, :class => 'active-scaffold-component') do
        url = url_for(url_options)
        # parse the ActiveRecord model name from the controller path, which
        # might be a namespaced controller (e.g., 'admin/admins')
        model = remote_controller.to_s.sub(/.*\//, '').singularize
        (:div, :class => 'active-scaffold-header') do
           :h2, link_to(args.first[:label] || active_scaffold_config_for(model).list.label, url, :remote => true)
        end <<
        if ActiveScaffold.js_framework == :prototype
          javascript_tag("new Ajax.Updater('#{id}', '#{url}', {method: 'get', evalScripts: true});")
        elsif ActiveScaffold.js_framework == :jquery
          javascript_tag("jQuery('##{id}').load('#{url}');")
        end
      end
    end

  else
    options = args.first
    if options.is_a?(Hash)
      current_view = {:view => options[:partial], :partial => true} if options[:partial]
      current_view = {:view => options[:template], :partial => false} if current_view.nil? && options[:template]
      current_view[:locals] = options[:locals] if !current_view.nil? && options[:locals]
      view_stack << current_view if current_view.present?
    end
    result = render_without_active_scaffold(*args, &block)
    view_stack.pop if current_view.present?
    result
  end
end

#view_stackObject



110
111
112
# File 'lib/active_scaffold/extensions/action_view_rendering.rb', line 110

def view_stack
  @_view_stack ||= []
end