active_scaffold 3.1.20 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/jquery/active_scaffold.js +4 -1
- data/app/assets/javascripts/prototype/active_scaffold.js +4 -1
- data/app/assets/stylesheets/{active_scaffold.scss~ → active_scaffold.css.scss} +5 -2
- data/app/assets/stylesheets/{active_scaffold_colors.scss → active_scaffold_colors.css.scss} +4 -0
- data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
- data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
- data/lib/active_scaffold/actions/core.rb +1 -0
- data/lib/active_scaffold/actions/nested.rb +0 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +1 -1
- data/lib/active_scaffold/helpers/form_column_helpers.rb +1 -0
- data/lib/active_scaffold/version.rb +2 -2
- data/test/mock_app/.gitignore +2 -0
- metadata +86 -164
- data/app/assets/javascripts/active_scaffold.js.erb~ +0 -16
- data/app/assets/javascripts/jquery/active_scaffold.js~ +0 -1053
- data/app/assets/javascripts/jquery/draggable_lists.js~ +0 -27
- data/app/assets/javascripts/prototype/active_scaffold.js~ +0 -1037
- data/app/assets/stylesheets/active_scaffold.css.erb +0 -11
- data/app/assets/stylesheets/active_scaffold.css.erb~ +0 -11
- data/app/assets/stylesheets/active_scaffold.css.scss.erb~ +0 -1120
- data/app/assets/stylesheets/active_scaffold.css.scss~ +0 -11
- data/app/assets/stylesheets/active_scaffold.css~ +0 -11
- data/app/assets/stylesheets/active_scaffold_colors.css +0 -244
- data/app/assets/stylesheets/active_scaffold_colors.css.scss~ +0 -481
- data/app/assets/stylesheets/active_scaffold_default.css.erb +0 -47
- data/app/assets/stylesheets/active_scaffold_default.css.erb~ +0 -57
- data/app/assets/stylesheets/active_scaffold_default.css.scss~ +0 -1092
- data/app/assets/stylesheets/active_scaffold_default.css~ +0 -923
- data/app/assets/stylesheets/active_scaffold_layout.css~ +0 -922
- data/app/assets/stylesheets/blue-theme.css~ +0 -1150
- data/config/locales/es.yml~ +0 -120
- data/frontends/default/views/_action_group.html.erb~ +0 -24
- data/frontends/default/views/_base_form.html.erb~ +0 -42
- data/frontends/default/views/_form.html.erb~ +0 -26
- data/frontends/default/views/_form_association.html.erb~ +0 -19
- data/frontends/default/views/_form_association_footer.html.erb~ +0 -48
- data/frontends/default/views/_horizontal_subform.html.erb~ +0 -32
- data/frontends/default/views/_horizontal_subform_header.html.erb~ +0 -11
- data/frontends/default/views/_horizontal_subform_record.html.erb~ +0 -38
- data/frontends/default/views/_list_actions.html.erb~ +0 -15
- data/frontends/default/views/_list_inline_adapter.html.erb~ +0 -10
- data/frontends/default/views/_list_messages.html.erb~ +0 -30
- data/frontends/default/views/_list_pagination.html.erb~ +0 -11
- data/frontends/default/views/_list_pagination_links.html.erb~ +0 -0
- data/frontends/default/views/_list_with_header.html.erb~ +0 -36
- data/frontends/default/views/_render_field.js.erb~ +0 -23
- data/frontends/default/views/_row.html.erb~ +0 -6
- data/frontends/default/views/_show.html.erb~ +0 -8
- data/frontends/default/views/_update_form.html.erb~ +0 -6
- data/frontends/default/views/_vertical_subform.html.erb~ +0 -12
- data/frontends/default/views/add_existing.js.erb~ +0 -18
- data/frontends/default/views/add_existing_form.html.erb~ +0 -5
- data/frontends/default/views/create.html.erb~ +0 -5
- data/frontends/default/views/edit_associated.js.erb~ +0 -13
- data/frontends/default/views/on_create.js.erb~ +0 -45
- data/frontends/default/views/on_update.js.erb~ +0 -31
- data/frontends/default/views/render_field.js.erb~ +0 -1
- data/frontends/default/views/search.html.erb~ +0 -5
- data/frontends/default/views/show.html.erb~ +0 -5
- data/frontends/default/views/update.html.erb~ +0 -8
- data/frontends/default/views/update_column.js.erb~ +0 -16
- data/lib/active_scaffold.rb~ +0 -373
- data/lib/active_scaffold/actions/core.rb~ +0 -203
- data/lib/active_scaffold/actions/create.rb~ +0 -148
- data/lib/active_scaffold/actions/list.rb~ +0 -196
- data/lib/active_scaffold/actions/nested.rb~ +0 -247
- data/lib/active_scaffold/actions/search.rb~ +0 -49
- data/lib/active_scaffold/actions/subform.rb~ +0 -27
- data/lib/active_scaffold/actions/update.rb~ +0 -150
- data/lib/active_scaffold/attribute_params.rb~ +0 -203
- data/lib/active_scaffold/bridges/date_picker/helper.rb~ +0 -180
- data/lib/active_scaffold/bridges/record_select/helpers.rb~ +0 -86
- data/lib/active_scaffold/bridges/shared/date_bridge.rb~ +0 -209
- data/lib/active_scaffold/config/base.rb~ +0 -72
- data/lib/active_scaffold/config/list.rb~ +0 -195
- data/lib/active_scaffold/config/nested.rb~ +0 -41
- data/lib/active_scaffold/config/search.rb~ +0 -74
- data/lib/active_scaffold/constraints.rb~ +0 -186
- data/lib/active_scaffold/data_structures/action_columns.rb~ +0 -140
- data/lib/active_scaffold/data_structures/action_link.rb~ +0 -179
- data/lib/active_scaffold/data_structures/nested_info.rb~ +0 -147
- data/lib/active_scaffold/extensions/action_controller_rendering.rb~ +0 -22
- data/lib/active_scaffold/extensions/action_view_rendering.rb~ +0 -120
- data/lib/active_scaffold/extensions/active_association_reflection.rb~ +0 -22
- data/lib/active_scaffold/extensions/cache_association.rb~ +0 -12
- data/lib/active_scaffold/extensions/reverse_associations.rb~ +0 -64
- data/lib/active_scaffold/extensions/routing_mapper.rb~ +0 -48
- data/lib/active_scaffold/extensions/unsaved_associated.rb~ +0 -62
- data/lib/active_scaffold/finder.rb~ +0 -370
- data/lib/active_scaffold/helpers/controller_helpers.rb~ +0 -92
- data/lib/active_scaffold/helpers/form_column_helpers.rb~ +0 -320
- data/lib/active_scaffold/helpers/id_helpers.rb~ +0 -123
- data/lib/active_scaffold/helpers/list_column_helpers.rb~ +0 -370
- data/lib/active_scaffold/helpers/search_column_helpers.rb~ +0 -263
- data/lib/active_scaffold/helpers/view_helpers.rb~ +0 -350
@@ -1,147 +0,0 @@
|
|
1
|
-
module ActiveScaffold::DataStructures
|
2
|
-
class NestedInfo
|
3
|
-
def self.get(model, params)
|
4
|
-
nested_info = {}
|
5
|
-
begin
|
6
|
-
nested_info[:name] = (params[:association] || params[:named_scope]).to_sym
|
7
|
-
nested_info[:parent_scaffold] = "#{params[:parent_scaffold].to_s.camelize}Controller".constantize
|
8
|
-
nested_info[:parent_model] = nested_info[:parent_scaffold].active_scaffold_config.model
|
9
|
-
nested_info[:parent_id] = params[nested_info[:parent_model].name.foreign_key]
|
10
|
-
if nested_info[:parent_id]
|
11
|
-
unless params[:association].nil?
|
12
|
-
ActiveScaffold::DataStructures::NestedInfoAssociation.new(model, nested_info)
|
13
|
-
else
|
14
|
-
ActiveScaffold::DataStructures::NestedInfoScope.new(model, nested_info)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
rescue ActiveScaffold::ControllerNotFound
|
18
|
-
nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
attr_accessor :association, :child_association, :parent_model, :parent_scaffold, :parent_id, :constrained_fields, :scope
|
23
|
-
|
24
|
-
def initialize(model, nested_info)
|
25
|
-
@parent_model = nested_info[:parent_model]
|
26
|
-
@parent_id = nested_info[:parent_id]
|
27
|
-
@parent_scaffold = nested_info[:parent_scaffold]
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_params
|
31
|
-
{:parent_scaffold => parent_scaffold.controller_path}
|
32
|
-
end
|
33
|
-
|
34
|
-
def new_instance?
|
35
|
-
result = @new_instance.nil?
|
36
|
-
@new_instance = false
|
37
|
-
result
|
38
|
-
end
|
39
|
-
|
40
|
-
def parent_scope
|
41
|
-
parent_model.find(parent_id)
|
42
|
-
end
|
43
|
-
|
44
|
-
def habtm?
|
45
|
-
false
|
46
|
-
end
|
47
|
-
|
48
|
-
def belongs_to?
|
49
|
-
false
|
50
|
-
end
|
51
|
-
|
52
|
-
def has_one?
|
53
|
-
false
|
54
|
-
end
|
55
|
-
|
56
|
-
def readonly?
|
57
|
-
false
|
58
|
-
end
|
59
|
-
|
60
|
-
def sorted?
|
61
|
-
false
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
class NestedInfoAssociation < NestedInfo
|
66
|
-
def initialize(model, nested_info)
|
67
|
-
super(model, nested_info)
|
68
|
-
@association = parent_model.reflect_on_association(nested_info[:name])
|
69
|
-
iterate_model_associations(model)
|
70
|
-
end
|
71
|
-
|
72
|
-
def name
|
73
|
-
self.association.name
|
74
|
-
end
|
75
|
-
|
76
|
-
def habtm?
|
77
|
-
association.macro == :has_and_belongs_to_many
|
78
|
-
end
|
79
|
-
|
80
|
-
def belongs_to?
|
81
|
-
association.belongs_to?
|
82
|
-
end
|
83
|
-
|
84
|
-
def has_one?
|
85
|
-
association.macro == :has_one
|
86
|
-
end
|
87
|
-
|
88
|
-
def readonly?
|
89
|
-
if association.options.has_key? :readonly
|
90
|
-
association.options[:readonly]
|
91
|
-
else
|
92
|
-
association.options.has_key? :through
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def sorted?
|
97
|
-
association.options.has_key? :order
|
98
|
-
end
|
99
|
-
|
100
|
-
def default_sorting
|
101
|
-
association.options[:order]
|
102
|
-
end
|
103
|
-
|
104
|
-
def to_params
|
105
|
-
super.merge(:association => @association.name, :assoc_id => parent_id)
|
106
|
-
end
|
107
|
-
|
108
|
-
protected
|
109
|
-
|
110
|
-
def iterate_model_associations(model)
|
111
|
-
@constrained_fields = []
|
112
|
-
@constrained_fields << association.foreign_key.to_sym unless association.belongs_to?
|
113
|
-
model.reflect_on_all_associations.each do |current|
|
114
|
-
debugger
|
115
|
-
if !current.belongs_to? && association.foreign_key == current.association_foreign_key
|
116
|
-
constrained_fields << current.name.to_sym
|
117
|
-
@child_association = current if current.klass == @parent_model
|
118
|
-
end
|
119
|
-
if association.foreign_key == current.foreign_key
|
120
|
-
# show columns for has_many and has_one child associationes
|
121
|
-
constrained_fields << current.name.to_sym if current.belongs_to?
|
122
|
-
if association.options[:as] and current.options[:polymorphic]
|
123
|
-
@child_association = current if association.options[:as].to_sym == current.name
|
124
|
-
else
|
125
|
-
@child_association = current if current.klass == @parent_model
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
class NestedInfoScope < NestedInfo
|
133
|
-
def initialize(model, nested_info)
|
134
|
-
super(model, nested_info)
|
135
|
-
@scope = nested_info[:name]
|
136
|
-
@constrained_fields = []
|
137
|
-
end
|
138
|
-
|
139
|
-
def to_params
|
140
|
-
super.merge(:named_scope => @scope)
|
141
|
-
end
|
142
|
-
|
143
|
-
def name
|
144
|
-
self.scope
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# wrap the action rendering for ActiveScaffold controllers
|
2
|
-
module ActionController #:nodoc:
|
3
|
-
class Base
|
4
|
-
def render_with_active_scaffold(*args, &block)
|
5
|
-
if self.class.uses_active_scaffold? and params[:adapter] and @rendering_adapter.nil?
|
6
|
-
@rendering_adapter = true # recursion control
|
7
|
-
# if we need an adapter, then we render the actual stuff to a string and insert it into the adapter template
|
8
|
-
opts = args.blank? ? Hash.new : args.first
|
9
|
-
render :partial => params[:adapter][1..-1],
|
10
|
-
:locals => {:payload => render_to_string(opts.merge(:layout => false), &block).html_safe},
|
11
|
-
:use_full_path => true, :layout => false, :content_type => :html
|
12
|
-
@rendering_adapter = nil # recursion control
|
13
|
-
else
|
14
|
-
render_without_active_scaffold(*args, &block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
alias_method_chain :render, :active_scaffold
|
18
|
-
|
19
|
-
# Rails 2.x implementation is post-initialization on :active_scaffold method
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
@@ -1,120 +0,0 @@
|
|
1
|
-
module ActionView
|
2
|
-
class LookupContext
|
3
|
-
attr_accessor :uses_active_scaffold
|
4
|
-
module ViewPaths
|
5
|
-
def find_all_templates(name, partial = false, locals = {})
|
6
|
-
prefixes.collect do |prefix|
|
7
|
-
view_paths.collect do |resolver|
|
8
|
-
temp_args = *args_for_lookup(name, [prefix], partial, locals)
|
9
|
-
temp_args[1] = temp_args[1][0]
|
10
|
-
resolver.find_all(*temp_args)
|
11
|
-
end
|
12
|
-
end.flatten!
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Overload formats= to expand ["*/*"] values and automatically
|
17
|
-
# add :html as fallback to :js.
|
18
|
-
def formats=(values)
|
19
|
-
debugger
|
20
|
-
if values == [:js] && uses_active_scaffold
|
21
|
-
_set_detail(:formats, values) if values != @details[:formats]
|
22
|
-
else
|
23
|
-
super(values)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# wrap the action rendering for ActiveScaffold views
|
30
|
-
module ActionView::Helpers #:nodoc:
|
31
|
-
module RenderingHelper
|
32
|
-
#
|
33
|
-
# Adds two rendering options.
|
34
|
-
#
|
35
|
-
# ==render :super
|
36
|
-
#
|
37
|
-
# This syntax skips all template overrides and goes directly to the provided ActiveScaffold templates.
|
38
|
-
# Useful if you want to wrap an existing template. Just call super!
|
39
|
-
#
|
40
|
-
# ==render :active_scaffold => #{controller.to_s}, options = {}+
|
41
|
-
#
|
42
|
-
# Lets you embed an ActiveScaffold by referencing the controller where it's configured.
|
43
|
-
#
|
44
|
-
# You may specify options[:constraints] for the embedded scaffold. These constraints have three effects:
|
45
|
-
# * the scaffold's only displays records matching the constraint
|
46
|
-
# * all new records created will be assigned the constrained values
|
47
|
-
# * constrained columns will be hidden (they're pretty boring at this point)
|
48
|
-
#
|
49
|
-
# You may also specify options[:conditions] for the embedded scaffold. These only do 1/3 of what
|
50
|
-
# constraints do (they only limit search results). Any format accepted by ActiveRecord::Base.find is valid.
|
51
|
-
#
|
52
|
-
# Defining options[:label] lets you completely customize the list title for the embedded scaffold.
|
53
|
-
#
|
54
|
-
def render_with_active_scaffold(*args, &block)
|
55
|
-
if args.first == :super
|
56
|
-
last_view = view_stack.last || {:view => instance_variable_get(:@virtual_path).split('/').last}
|
57
|
-
options = args[1] || {}
|
58
|
-
options[:locals] ||= {}
|
59
|
-
options[:locals].reverse_merge!(last_view[:locals] || {})
|
60
|
-
if last_view[:templates].nil?
|
61
|
-
last_view[:templates] = lookup_context.find_all_templates(last_view[:view], last_view[:partial], options[:locals].keys)
|
62
|
-
last_view[:templates].shift
|
63
|
-
end
|
64
|
-
options[:template] = last_view[:templates].shift
|
65
|
-
view_stack << last_view
|
66
|
-
result = render_without_active_scaffold options
|
67
|
-
view_stack.pop
|
68
|
-
result
|
69
|
-
elsif args.first.is_a? Hash and args.first[:active_scaffold]
|
70
|
-
require 'digest/md5'
|
71
|
-
options = args.first
|
72
|
-
|
73
|
-
remote_controller = options[:active_scaffold]
|
74
|
-
constraints = options[:constraints]
|
75
|
-
conditions = options[:conditions]
|
76
|
-
eid = Digest::MD5.hexdigest(params[:controller] + remote_controller.to_s + constraints.to_s + conditions.to_s)
|
77
|
-
session["as:#{eid}"] = {:constraints => constraints, :conditions => conditions, :list => {:label => args.first[:label]}}
|
78
|
-
options[:params] ||= {}
|
79
|
-
options[:params].merge! :eid => eid, :embedded => true
|
80
|
-
|
81
|
-
id = "as_#{eid}-embedded"
|
82
|
-
url_options = {:controller => remote_controller.to_s, :action => 'index'}.merge(options[:params])
|
83
|
-
|
84
|
-
if controller.respond_to?(:render_component_into_view)
|
85
|
-
controller.send(:render_component_into_view, url_options)
|
86
|
-
else
|
87
|
-
content_tag(:div, :id => id, :class => 'active-scaffold-component') do
|
88
|
-
url = url_for(url_options)
|
89
|
-
content_tag(:div, :class => 'active-scaffold-header') do
|
90
|
-
content_tag :h2, link_to(args.first[:label] || active_scaffold_config_for(remote_controller.to_s.singularize).list.label, url, :remote => true)
|
91
|
-
end <<
|
92
|
-
if ActiveScaffold.js_framework == :prototype
|
93
|
-
javascript_tag("new Ajax.Updater('#{id}', '#{url}', {method: 'get', evalScripts: true});")
|
94
|
-
elsif ActiveScaffold.js_framework == :jquery
|
95
|
-
javascript_tag("$('##{id}').load('#{url}');")
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
else
|
101
|
-
options = args.first
|
102
|
-
if options.is_a?(Hash)
|
103
|
-
current_view = {:view => options[:partial], :partial => true} if options[:partial]
|
104
|
-
current_view = {:view => options[:template], :partial => false} if current_view.nil? && options[:template]
|
105
|
-
current_view[:locals] = options[:locals] if !current_view.nil? && options[:locals]
|
106
|
-
view_stack << current_view if current_view.present?
|
107
|
-
end
|
108
|
-
result = render_without_active_scaffold(*args, &block)
|
109
|
-
view_stack.pop if current_view.present?
|
110
|
-
result
|
111
|
-
end
|
112
|
-
end
|
113
|
-
alias_method_chain :render, :active_scaffold
|
114
|
-
|
115
|
-
def view_stack
|
116
|
-
@_view_stack ||= []
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# Bugfix: building an sti model from an association fails
|
2
|
-
# https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6306-collection-associations-build-method-not-supported-for-sti
|
3
|
-
# https://github.com/rails/rails/issues/815
|
4
|
-
# https://github.com/rails/rails/pull/1686
|
5
|
-
ActiveRecord::Reflection::AssociationReflection.class_eval do
|
6
|
-
def klass_with_sti(*opts)
|
7
|
-
sti_col = klass.inheritance_column
|
8
|
-
if (h = opts.first).is_a? Hash and (passed_type = ( h[sti_col] || h[sti_col.to_sym] )) and (new_klass = active_record.send(:compute_type, passed_type)) < klass
|
9
|
-
new_klass
|
10
|
-
else
|
11
|
-
klass
|
12
|
-
end
|
13
|
-
end
|
14
|
-
def build_association(*opts, &block)
|
15
|
-
self.original_build_association_called = true
|
16
|
-
klass_with_sti(*opts).new(*opts, &block)
|
17
|
-
end
|
18
|
-
def create_association(*opts, &block)
|
19
|
-
self.original_build_association_called = true
|
20
|
-
klass_with_sti(*opts).create(*opts, &block)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Reflection
|
3
|
-
class AssociationReflection #:nodoc:
|
4
|
-
def inverse_for?(klass)
|
5
|
-
inverse_class = self.klass unless options[:polymorphic]
|
6
|
-
inverse_class.present? && (inverse_class == klass || klass < inverse_class)
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_writer :reverse
|
10
|
-
def reverse
|
11
|
-
@reverse ||= inverse_of.try(:name)
|
12
|
-
end
|
13
|
-
|
14
|
-
def inverse_of_with_autodetect
|
15
|
-
inverse_of_without_autodetect || autodetect_inverse
|
16
|
-
end
|
17
|
-
alias_method_chain :inverse_of, :autodetect
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def autodetect_inverse
|
22
|
-
return nil if options[:polymorphic]
|
23
|
-
reverse_matches = []
|
24
|
-
|
25
|
-
# stage 1 filter: collect associations that point back to this model and use the same foreign_key
|
26
|
-
klass.reflect_on_all_associations.each do |assoc|
|
27
|
-
if self.options[:through]
|
28
|
-
# only iterate has_many :through associations
|
29
|
-
next unless assoc.options[:through]
|
30
|
-
next unless assoc.through_reflection.klass == self.through_reflection.klass
|
31
|
-
else
|
32
|
-
# skip over has_many :through associations
|
33
|
-
next if assoc.options[:through]
|
34
|
-
next unless assoc.options[:polymorphic] or assoc.class_name.constantize == self.active_record
|
35
|
-
|
36
|
-
case [assoc.macro, self.macro].find_all{|m| m == :has_and_belongs_to_many}.length
|
37
|
-
# if both are a habtm, then match them based on the join table
|
38
|
-
when 2
|
39
|
-
next unless assoc.options[:join_table] == self.options[:join_table]
|
40
|
-
|
41
|
-
# if only one is a habtm, they do not match
|
42
|
-
when 1
|
43
|
-
next
|
44
|
-
|
45
|
-
# otherwise, match them based on the foreign_key
|
46
|
-
when 0
|
47
|
-
next unless assoc.foreign_key.to_sym == self.foreign_key.to_sym
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
reverse_matches << assoc
|
52
|
-
end
|
53
|
-
|
54
|
-
# stage 2 filter: name-based matching (association name vs self.active_record.to_s)
|
55
|
-
reverse_matches.find_all do |assoc|
|
56
|
-
self.active_record.to_s.underscore.include? assoc.name.to_s.pluralize.singularize
|
57
|
-
end if reverse_matches.length > 1
|
58
|
-
|
59
|
-
reverse_matches.first
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module ActionDispatch
|
2
|
-
module Routing
|
3
|
-
ACTIVE_SCAFFOLD_CORE_ROUTING = {
|
4
|
-
:collection => {:show_search => :get, :render_field => :get},
|
5
|
-
:member => {:row => :get, :update_column => :post, :render_field => :get}
|
6
|
-
}
|
7
|
-
ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING = {
|
8
|
-
:collection => {:edit_associated => :get, :new_existing => :get, :add_existing => :post},
|
9
|
-
:member => {:edit_associated => :get, :add_association => :get, :destroy_existing => :delete}
|
10
|
-
}
|
11
|
-
class Mapper
|
12
|
-
module Base
|
13
|
-
def as_routes(options = {:association => true})
|
14
|
-
collection do
|
15
|
-
ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:collection].each {|name, type| send(type, name)}
|
16
|
-
end
|
17
|
-
member do
|
18
|
-
ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:member].each {|name, type| send(type, name)}
|
19
|
-
end
|
20
|
-
as_association_routes if options[:association]
|
21
|
-
end
|
22
|
-
|
23
|
-
def as_association_routes
|
24
|
-
collection do
|
25
|
-
ActionDispatch::Routing::ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING[:collection].each {|name, type| send(type, name)}
|
26
|
-
end
|
27
|
-
member do
|
28
|
-
ActionDispatch::Routing::ACTIVE_SCAFFOLD_ASSOCIATION_ROUTING[:member].each {|name, type| send(type, name)}
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def as_nested_resources(*resources)
|
33
|
-
options = resources.extract_options!
|
34
|
-
resources.each do |resource|
|
35
|
-
resources(resource, options.merge(:parent_scaffold => merge_module_scope(@scope[:module], parent_resource.plural), :association => resource)) { yield if block_given? }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def as_scoped_routes(*scopes)
|
40
|
-
options = scopes.extract_options!
|
41
|
-
scopes.each do |scope|
|
42
|
-
resources(parent_resource.plural, options.merge(:parent_scaffold => merge_module_scope(@scope[:module], parent_resource.plural), :named_scope => scope, :as => :scope)) { yield if block_given? }
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# save and validation support for associations.
|
2
|
-
class ActiveRecord::Base
|
3
|
-
def associated_valid?(path = [])
|
4
|
-
return true if path.include?(self) # prevent recursion (if associated and parent are new records)
|
5
|
-
path << self
|
6
|
-
# using [].all? syntax to avoid a short-circuit
|
7
|
-
with_unsaved_associated { |a| debugger; [a.valid?, a.associated_valid?(path)].all? {|v| v == true} }
|
8
|
-
end
|
9
|
-
|
10
|
-
def save_associated
|
11
|
-
with_unsaved_associated { |a| a.save and a.save_associated }
|
12
|
-
end
|
13
|
-
|
14
|
-
def save_associated!
|
15
|
-
save_associated or raise(ActiveRecord::RecordNotSaved)
|
16
|
-
end
|
17
|
-
|
18
|
-
def no_errors_in_associated?
|
19
|
-
with_unsaved_associated {|a| a.errors.count == 0 and a.no_errors_in_associated?}
|
20
|
-
end
|
21
|
-
|
22
|
-
protected
|
23
|
-
|
24
|
-
# Provide an override to allow the model to restrict which associations are considered
|
25
|
-
# by ActiveScaffolds update mechanism. This allows the model to restrict things like
|
26
|
-
# Acts-As-Versioned versions associations being traversed.
|
27
|
-
#
|
28
|
-
# By defining the method :scaffold_update_nofollow returning an array of associations
|
29
|
-
# these associations will not be traversed.
|
30
|
-
# By defining the method :scaffold_update_follow returning an array of associations,
|
31
|
-
# only those associations will be traversed.
|
32
|
-
#
|
33
|
-
# Otherwise the default behaviour of traversing all associations will be preserved.
|
34
|
-
def associations_for_update
|
35
|
-
if self.respond_to?( :scaffold_update_nofollow )
|
36
|
-
self.class.reflect_on_all_associations.reject { |association| self.scaffold_update_nofollow.include?( association.name ) }
|
37
|
-
elsif self.respond_to?( :scaffold_update_follow )
|
38
|
-
self.class.reflect_on_all_associations.select { |association| self.scaffold_update_follow.include?( association.name ) }
|
39
|
-
else
|
40
|
-
self.class.reflect_on_all_associations
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
# yields every associated object that has been instantiated and is flagged as unsaved.
|
47
|
-
# returns false if any yield returns false.
|
48
|
-
# returns true otherwise, even when none of the associations have been instantiated. build wrapper methods accordingly.
|
49
|
-
def with_unsaved_associated
|
50
|
-
associations_for_update.all? do |association|
|
51
|
-
association_proxy = send(association.name)
|
52
|
-
if association_proxy
|
53
|
-
records = association_proxy
|
54
|
-
records = [records] unless records.is_a? Array # convert singular associations into collections for ease of use
|
55
|
-
debugger
|
56
|
-
records.select {|r| r.unsaved? and not r.readonly?}.all? {|r| yield r} # must use select instead of find_all, which Rails overrides on association proxies for db access
|
57
|
-
else
|
58
|
-
true
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|