active_scaffold 3.6.0.pre → 3.6.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGELOG → CHANGELOG.rdoc} +39 -0
  3. data/app/assets/javascripts/active_scaffold.js.erb +0 -1
  4. data/app/assets/javascripts/jquery/active_scaffold.js +35 -4
  5. data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
  6. data/app/assets/stylesheets/active_scaffold_layout.css +52 -29
  7. data/app/views/active_scaffold_overrides/_list_header.html.erb +5 -7
  8. data/app/views/active_scaffold_overrides/_list_record.html.erb +4 -5
  9. data/app/views/active_scaffold_overrides/_list_with_header.html.erb +1 -1
  10. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
  11. data/config/locales/de.yml +2 -1
  12. data/config/locales/en.yml +1 -0
  13. data/config/locales/es.yml +1 -0
  14. data/config/locales/fr.yml +2 -1
  15. data/config/locales/hu.yml +1 -0
  16. data/config/locales/ja.yml +1 -0
  17. data/config/locales/ru.yml +1 -0
  18. data/lib/active_scaffold.rb +8 -3
  19. data/lib/active_scaffold/actions/common_search.rb +11 -8
  20. data/lib/active_scaffold/actions/core.rb +79 -51
  21. data/lib/active_scaffold/actions/create.rb +27 -27
  22. data/lib/active_scaffold/actions/delete.rb +1 -1
  23. data/lib/active_scaffold/actions/field_search.rb +52 -42
  24. data/lib/active_scaffold/actions/list.rb +106 -23
  25. data/lib/active_scaffold/actions/nested.rb +59 -42
  26. data/lib/active_scaffold/actions/show.rb +3 -3
  27. data/lib/active_scaffold/actions/subform.rb +9 -16
  28. data/lib/active_scaffold/actions/update.rb +95 -77
  29. data/lib/active_scaffold/attribute_params.rb +93 -68
  30. data/lib/active_scaffold/bridges/active_storage.rb +6 -0
  31. data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +33 -0
  32. data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +54 -0
  33. data/lib/active_scaffold/bridges/active_storage/form_ui.rb +22 -0
  34. data/lib/active_scaffold/bridges/active_storage/list_ui.rb +36 -0
  35. data/lib/active_scaffold/bridges/bitfields.rb +1 -0
  36. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -15
  37. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +6 -0
  38. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +2 -2
  39. data/lib/active_scaffold/bridges/date_picker/helper.rb +46 -41
  40. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
  41. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
  42. data/lib/active_scaffold/bridges/file_column/form_ui.rb +3 -3
  43. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +3 -1
  44. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
  45. data/lib/active_scaffold/bridges/record_select/helpers.rb +3 -7
  46. data/lib/active_scaffold/bridges/shared/date_bridge.rb +19 -18
  47. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -1
  48. data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +20 -3
  49. data/lib/active_scaffold/config/base.rb +58 -34
  50. data/lib/active_scaffold/config/core.rb +31 -12
  51. data/lib/active_scaffold/config/delete.rb +12 -1
  52. data/lib/active_scaffold/config/list.rb +17 -7
  53. data/lib/active_scaffold/config/mark.rb +1 -1
  54. data/lib/active_scaffold/configurable.rb +5 -3
  55. data/lib/active_scaffold/constraints.rb +21 -19
  56. data/lib/active_scaffold/core.rb +35 -26
  57. data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
  58. data/lib/active_scaffold/data_structures/action_link.rb +34 -16
  59. data/lib/active_scaffold/data_structures/action_links.rb +9 -11
  60. data/lib/active_scaffold/data_structures/association/abstract.rb +35 -13
  61. data/lib/active_scaffold/data_structures/association/active_mongoid.rb +2 -6
  62. data/lib/active_scaffold/data_structures/association/active_record.rb +5 -1
  63. data/lib/active_scaffold/data_structures/association/mongoid.rb +0 -3
  64. data/lib/active_scaffold/data_structures/column.rb +49 -58
  65. data/lib/active_scaffold/data_structures/columns.rb +3 -2
  66. data/lib/active_scaffold/data_structures/nested_info.rb +20 -18
  67. data/lib/active_scaffold/data_structures/sorting.rb +5 -0
  68. data/lib/active_scaffold/delayed_setup.rb +16 -6
  69. data/lib/active_scaffold/extensions/action_controller_rendering.rb +1 -1
  70. data/lib/active_scaffold/extensions/action_view_rendering.rb +34 -14
  71. data/lib/active_scaffold/extensions/cow_proxy.rb +50 -2
  72. data/lib/active_scaffold/extensions/localize.rb +3 -1
  73. data/lib/active_scaffold/extensions/routing_mapper.rb +2 -2
  74. data/lib/active_scaffold/extensions/to_label.rb +3 -2
  75. data/lib/active_scaffold/finder.rb +81 -46
  76. data/lib/active_scaffold/helpers/action_link_helpers.rb +47 -21
  77. data/lib/active_scaffold/helpers/association_helpers.rb +13 -11
  78. data/lib/active_scaffold/helpers/controller_helpers.rb +14 -11
  79. data/lib/active_scaffold/helpers/form_column_helpers.rb +133 -99
  80. data/lib/active_scaffold/helpers/human_condition_helpers.rb +1 -1
  81. data/lib/active_scaffold/helpers/id_helpers.rb +4 -0
  82. data/lib/active_scaffold/helpers/list_column_helpers.rb +76 -49
  83. data/lib/active_scaffold/helpers/pagination_helpers.rb +2 -2
  84. data/lib/active_scaffold/helpers/search_column_helpers.rb +25 -30
  85. data/lib/active_scaffold/helpers/show_column_helpers.rb +3 -5
  86. data/lib/active_scaffold/helpers/view_helpers.rb +31 -22
  87. data/lib/active_scaffold/orm_checks.rb +2 -2
  88. data/lib/active_scaffold/paginator.rb +1 -3
  89. data/lib/active_scaffold/registry.rb +11 -0
  90. data/lib/active_scaffold/responds_to_parent.rb +6 -5
  91. data/lib/active_scaffold/tableless.rb +6 -8
  92. data/lib/active_scaffold/version.rb +1 -1
  93. data/shoulda_macros/macros.rb +3 -1
  94. data/test/bridges/paperclip_test.rb +1 -1
  95. data/test/company.rb +2 -2
  96. data/test/data_structures/action_columns_test.rb +2 -2
  97. data/test/data_structures/column_test.rb +3 -6
  98. data/test/data_structures/columns_test.rb +2 -2
  99. data/test/extensions/active_record_test.rb +4 -4
  100. data/test/extensions/routing_mapper_test.rb +2 -2
  101. data/test/helpers/list_column_helpers_test.rb +3 -1
  102. data/test/misc/active_record_permissions_test.rb +2 -2
  103. data/test/misc/attribute_params_test.rb +4 -0
  104. data/test/misc/configurable_test.rb +10 -10
  105. data/test/misc/convert_numbers_format_test.rb +4 -0
  106. data/test/mock_app/app/assets/config/manifest.js +0 -0
  107. data/test/mock_app/app/controllers/cars_controller.rb +1 -0
  108. data/test/mock_app/app/controllers/people_controller.rb +3 -1
  109. data/test/mock_app/config/application.rb +1 -0
  110. data/test/mock_app/config/routes.rb +4 -1
  111. data/test/mock_app/db/schema.rb +2 -0
  112. data/test/performance/list_cars_performance_test.rb +34 -0
  113. data/test/performance/list_people_performance_test.rb +31 -0
  114. data/test/performance_test_help.rb +3 -0
  115. data/test/test_helper.rb +2 -1
  116. metadata +22 -12
  117. data/app/assets/javascripts/prototype/rico_corner.js +0 -370
  118. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -5
@@ -1,4 +1,4 @@
1
- <%= content_tag(:div, id: active_scaffold_id, class: as_main_div_class, data: params[:eid] ? {eid: id_from_controller(params[:eid])} : {}) do %>
1
+ <%= content_tag(:div, id: active_scaffold_id, class: as_main_div_class, data: as_main_div_data) do %>
2
2
  <div class="active-scaffold-header">
3
3
  <%= render :partial => 'list_header' %>
4
4
  </div>
@@ -4,7 +4,11 @@
4
4
 
5
5
  <% if @page.pager.infinite? || @page.number < @page.pager.number_of_pages -%>
6
6
  ActiveScaffold.auto_load_page('<%= url_for main_path_to_return %>', {auto_pagination: true, page: <%= @page.number + 1 %>});
7
+ <% else %>
8
+ ActiveScaffold.hide('<%= loading_indicator_id(action: :pagination) %>');
7
9
  <% end # @page.pager.infinite?... %>
10
+ <% else %>
11
+ ActiveScaffold.hide('<%= loading_indicator_id(action: :pagination) %>');
8
12
  <% end # @page.items.present? %>
9
13
 
10
14
  <% elsif active_scaffold_config.list.refresh_with_header -%>
@@ -107,7 +107,8 @@ de:
107
107
  other: "%{count} %{model} makriert"
108
108
  refresh: Neu laden
109
109
  remove: Entfernen
110
- remove_file: Entferne oder Ersetze Datei
110
+ remove_file: Entferne oder Ersetzte Datei
111
+ remove_files: Entfernen oder Hinzufügen Dateien
111
112
  replace_existing: Existierenden ersetzen
112
113
  replace_with_new: Mit Neuer ersetzen
113
114
  reset: Zurücksetzen
@@ -108,6 +108,7 @@ en:
108
108
  refresh: Refresh
109
109
  remove: Remove
110
110
  remove_file: Remove or Replace file
111
+ remove_files: Remove or Add files
111
112
  replace_existing: Replace Existing
112
113
  replace_with_new: Replace With New
113
114
  reset: Reset
@@ -110,6 +110,7 @@ es:
110
110
  refresh: Recargar
111
111
  remove: Eliminar
112
112
  remove_file: Eliminar o Reemplazar archivo
113
+ remove_files: Eliminar o Añadir archivos
113
114
  replace_existing: Reemplazar existente
114
115
  replace_with_new: Reemplazar con Nuevo
115
116
  reset: Restaurar
@@ -107,7 +107,8 @@ fr:
107
107
  other: "%{count} %{model} marqués"
108
108
  refresh: Rafraîchir
109
109
  remove: Supprimer
110
- remove_file: Supprimer et remplacer le fichier
110
+ remove_file: Supprimer ou remplacer le fichier
111
+ remove_files: Supprimer ou Ajouter des fichiers
111
112
  replace_existing: Remplacer existant(e)
112
113
  replace_with_new: Remplacer avec le nouveau
113
114
  reset: Annuler
@@ -108,6 +108,7 @@ hu:
108
108
  refresh: Frissítés
109
109
  remove: Törlés
110
110
  remove_file: Fájl törlése, vagy cseréje
111
+ remove_files: Fájlok törlése, vagy hozzáadása
111
112
  replace_existing: Replace existing
112
113
  replace_with_new: Csere újjal
113
114
  reset: Alapállapot
@@ -108,6 +108,7 @@ ja:
108
108
  refresh: Refresh
109
109
  remove: 削除
110
110
  remove_file: ファイルを削除または置換
111
+ remove_files: ファイルを削除または追加する
111
112
  replace_existing: Replace existing
112
113
  replace_with_new: 新しいもので置換
113
114
  reset: リセット
@@ -116,6 +116,7 @@ ru:
116
116
  refresh: Обновить
117
117
  remove: Удалить
118
118
  remove_file: Удалить или заменить файл
119
+ remove_files: Удалить или Добавить файлы
119
120
  replace_existing: Заменить существующим
120
121
  replace_with_new: Заменить новым
121
122
  reset: Сброс
@@ -41,8 +41,8 @@ module ActiveScaffold
41
41
 
42
42
  class ControllerNotFound < RuntimeError; end
43
43
  class MalformedConstraint < RuntimeError; end
44
- class RecordNotAllowed < SecurityError; end
45
- class ActionNotAllowed < SecurityError; end
44
+ class RecordNotAllowed < RuntimeError; end
45
+ class ActionNotAllowed < RuntimeError; end
46
46
  class ReverseAssociationRequired < RuntimeError; end
47
47
 
48
48
  mattr_accessor :delayed_setup, instance_writer: false
@@ -84,7 +84,12 @@ module ActiveScaffold
84
84
  File.dirname(__FILE__) + '/..'
85
85
  end
86
86
 
87
- def self.set_defaults(&block)
87
+ def self.set_defaults(&block) # rubocop:disable Naming/AccessorMethodName
88
+ ActiveSupport::Deprecation.warn 'use ActiveScaffold.defaults'
89
+ defaults(&block)
90
+ end
91
+
92
+ def self.defaults(&block)
88
93
  ActiveScaffold::Config::Core.configure(&block)
89
94
  end
90
95
  end
@@ -1,13 +1,12 @@
1
1
  module ActiveScaffold::Actions
2
2
  module CommonSearch
3
3
  def self.included(base)
4
- unless base < InstanceMethods
5
- base.send :include, InstanceMethods
6
- base.before_action :search_authorized_filter, :only => :show_search
7
- base.before_action :store_search_params_into_session, :only => [:index]
8
- base.before_action :do_search, :only => [:index]
9
- base.helper_method :search_params
10
- end
4
+ return if base < InstanceMethods
5
+ base.send :include, InstanceMethods
6
+ base.before_action :search_authorized_filter, :only => :show_search
7
+ base.before_action :store_search_params_into_session, :only => [:index]
8
+ base.before_action :do_search, :only => [:index]
9
+ base.helper_method :search_params
11
10
  end
12
11
 
13
12
  module InstanceMethods
@@ -34,7 +33,11 @@ module ActiveScaffold::Actions
34
33
 
35
34
  def store_search_params_into_session
36
35
  if active_scaffold_config.store_user_settings
37
- active_scaffold_session_storage['search'] = permitted_search_params if params[:search]
36
+ if params[:search].present?
37
+ active_scaffold_session_storage['search'] = permitted_search_params
38
+ elsif params.key? :search
39
+ active_scaffold_session_storage.delete 'search'
40
+ end
38
41
  else
39
42
  @search_params = permitted_search_params
40
43
  end
@@ -6,7 +6,7 @@ module ActiveScaffold::Actions
6
6
  before_action :check_input_device
7
7
  before_action :register_constraints_with_action_columns, :unless => :nested?
8
8
  after_action :clear_flashes
9
- after_action :clear_storage
9
+ around_action :clear_storage
10
10
  rescue_from ActiveScaffold::RecordNotAllowed, ActiveScaffold::ActionNotAllowed, :with => :deny_access
11
11
  end
12
12
  base.helper_method :active_scaffold_config
@@ -72,7 +72,7 @@ module ActiveScaffold::Actions
72
72
  else
73
73
  updated_record_with_column(@column, params.delete(:value), @scope)
74
74
  end
75
- set_parent(@record) if main_form_controller && @scope
75
+ setup_parent(@record) if main_form_controller && @scope
76
76
  after_render_field(@record, @column)
77
77
  end
78
78
 
@@ -111,7 +111,7 @@ module ActiveScaffold::Actions
111
111
  "#{params[:parent_controller].camelize}Controller"
112
112
  end
113
113
 
114
- def set_parent(record)
114
+ def setup_parent(record)
115
115
  cfg = main_form_controller.active_scaffold_config
116
116
  association = cfg.columns[subform_child_association]&.association&.reverse_association
117
117
  return if association.nil?
@@ -129,8 +129,8 @@ module ActiveScaffold::Actions
129
129
  end
130
130
 
131
131
  if params[:nested] # form in nested scaffold, set nested parent_record to parent
132
- nested = ActiveScaffold::DataStructures::NestedInfo.get(parent.class, params.delete(:nested))
133
- if nested.child_association
132
+ nested = ActiveScaffold::DataStructures::NestedInfo.get(parent.class, params[:nested])
133
+ if nested&.child_association && !nested.child_association.polymorphic?
134
134
  apply_constraints_to_record(parent, constraints: {nested.child_association.name => nested.parent_id})
135
135
  end
136
136
  end
@@ -179,14 +179,12 @@ module ActiveScaffold::Actions
179
179
  # ex: accepts? :html, :xml
180
180
  def accepts?(*types)
181
181
  request.accepts.compact.each do |priority|
182
- if priority == Mime::ALL
183
- # Because IE always sends */* in the accepts header and we assume
184
- # that if you really wanted XML or something else you would say so
185
- # explicitly, we will assume */* to only ask for :html
186
- return types.include?(:html)
187
- elsif types.include?(priority.to_sym)
188
- return true
189
- end
182
+ # Because IE always sends */* in the accepts header and we assume
183
+ # that if you really wanted XML or something else you would say so
184
+ # explicitly, we will assume */* to only ask for :html
185
+ return types.include?(:html) if priority == Mime::ALL
186
+
187
+ return true if types.include?(priority.to_sym)
190
188
  end
191
189
  false
192
190
  end
@@ -204,6 +202,18 @@ module ActiveScaffold::Actions
204
202
  @response_object ||= successful? ? (@record || @records) : @record.errors
205
203
  end
206
204
 
205
+ def response_to_api(format, columns_names, options = {})
206
+ render(
207
+ options.reverse_merge(
208
+ format => response_object,
209
+ :only => columns_names + [active_scaffold_config.model.primary_key],
210
+ :include => association_columns(columns_names),
211
+ :methods => virtual_columns(columns_names),
212
+ :status => response_status
213
+ )
214
+ )
215
+ end
216
+
207
217
  # Success is the existence of one or more model objects. Most actions
208
218
  # circumvent this method by setting @success directly.
209
219
  def successful?
@@ -234,18 +244,19 @@ module ActiveScaffold::Actions
234
244
  # Builds search conditions by search params for column names. This allows urls like "contacts/list?company_id=5".
235
245
  def conditions_from_params
236
246
  @conditions_from_params ||= begin
237
- conditions = {}
247
+ conditions = [{}]
238
248
  params.except(:controller, :action, :page, :sort, :sort_direction, :format, :id).each do |key, value|
239
- column = active_scaffold_config._columns_hash[key.to_s]
249
+ distinct = true if key =~ /!$/
250
+ column = active_scaffold_config._columns_hash[key.to_s[0..(distinct ? -2 : -1)]]
240
251
  next unless column
241
- key = key.to_sym
252
+ key = column.name.to_sym
242
253
  not_string = %i[string text].exclude?(column.type)
243
254
  next if active_scaffold_constraints[key]
244
255
  next if nested? && nested.param_name == key
245
256
 
246
- range = %i[date datetime].include?(column.type) && value.is_a?(String) && value.scan('..').size == 1
257
+ range = %i[date datetime integer decimal float bigint].include?(column.type) && value.is_a?(String) && value.scan('..').size == 1
247
258
  value = value.split('..') if range
248
- conditions[key] =
259
+ value =
249
260
  if value.is_a?(Array)
250
261
  value.map { |v| v == '' && not_string ? nil : ActiveScaffold::Core.column_type_cast(v, column) }
251
262
  elsif value == '' && (not_string || column.null)
@@ -253,30 +264,36 @@ module ActiveScaffold::Actions
253
264
  else
254
265
  ActiveScaffold::Core.column_type_cast(value, column)
255
266
  end
256
- conditions[key] = Range.new(*conditions[key]) if range
267
+ value = Range.new(*value) if range
268
+ if distinct
269
+ conditions << active_scaffold_config.model.arel_table[key].not_eq(value)
270
+ else
271
+ conditions[0][key] = value
272
+ end
257
273
  end
258
274
  conditions
259
275
  end
260
276
  end
261
277
 
262
278
  def new_model
263
- # ignore nested unrelated to current controller, e.g. adding record in subform inside subform, would create wrong parent_record
264
- if nested? && nested.association && nested.association.klass != active_scaffold_config.model
265
- return active_scaffold_config.model.new
266
- end
267
279
  relation = beginning_of_chain
268
- config = active_scaffold_config_for(relation.klass) if nested? && nested.plural_association?
269
- column = relation.klass.inheritance_column if config
270
- if column && config._columns_hash[column]
271
- model_name = params.delete(column) # in new action inheritance_column must be in params
272
- model_name ||= params[:record]&.delete(column) # in create action must be inside record key
273
- model_name = model_name.camelize if model_name
274
- model_name ||= active_scaffold_config.model.name
275
- build_options = {column.to_sym => model_name} if model_name
276
- end
280
+ build_options = sti_nested_build_options(relation.klass) if nested? && nested.plural_association?
277
281
  relation.respond_to?(:build) ? relation.build(build_options || {}) : relation.new
278
282
  end
279
283
 
284
+ def sti_nested_build_options(klass)
285
+ config = active_scaffold_config_for(klass)
286
+ return unless config
287
+ column = klass.inheritance_column
288
+ return unless column && config._columns_hash[column]
289
+
290
+ model_name = params.delete(column) # in new action inheritance_column must be in params
291
+ model_name ||= params[:record]&.delete(column) # in create action must be inside record key
292
+ model_name = model_name.camelize if model_name
293
+ model_name ||= active_scaffold_config.model.name
294
+ {column.to_sym => model_name} if model_name
295
+ end
296
+
280
297
  def get_row(crud_type_or_security_options = :read)
281
298
  klass = beginning_of_chain
282
299
  klass = klass.preload(active_scaffold_preload) unless active_scaffold_config.mongoid?
@@ -288,6 +305,8 @@ module ActiveScaffold::Actions
288
305
  end
289
306
 
290
307
  def clear_storage
308
+ yield if block_given?
309
+ ensure
291
310
  session_index = active_scaffold_session_storage_key
292
311
  session.delete(session_index) if session[session_index].blank?
293
312
  end
@@ -297,14 +316,13 @@ module ActiveScaffold::Actions
297
316
  end
298
317
 
299
318
  def check_input_device
300
- if session[:input_device_type].nil?
301
- if request.env['HTTP_USER_AGENT'] =~ /(iPhone|iPod|iPad)/i
302
- session[:input_device_type] = 'TOUCH'
303
- session[:hover_supported] = false
304
- else
305
- session[:input_device_type] = 'MOUSE'
306
- session[:hover_supported] = true
307
- end
319
+ return unless session[:input_device_type].nil?
320
+ if request.env['HTTP_USER_AGENT'] =~ /(iPhone|iPod|iPad)/i
321
+ session[:input_device_type] = 'TOUCH'
322
+ session[:hover_supported] = false
323
+ else
324
+ session[:input_device_type] = 'MOUSE'
325
+ session[:hover_supported] = true
308
326
  end
309
327
  end
310
328
 
@@ -367,12 +385,12 @@ module ActiveScaffold::Actions
367
385
  render :action => 'action_confirmation', :locals => {:record => @record, :link => link}
368
386
  end
369
387
 
388
+ def action_update_respond_on_iframe
389
+ responds_to_parent { action_update_respond_to_js }
390
+ end
391
+
370
392
  def action_update_respond_to_html
371
- if params[:iframe] == 'true' # was this an iframe post ?
372
- responds_to_parent { action_update_respond_to_js }
373
- else
374
- redirect_to :action => 'index'
375
- end
393
+ redirect_to :action => 'index'
376
394
  end
377
395
 
378
396
  def action_update_respond_to_js
@@ -380,11 +398,11 @@ module ActiveScaffold::Actions
380
398
  end
381
399
 
382
400
  def action_update_respond_to_xml
383
- render :xml => successful? ? '' : response_object, :only => list_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(list_columns_names), :methods => virtual_columns(list_columns_names), :status => response_status
401
+ response_to_api(:xml, list_columns_names)
384
402
  end
385
403
 
386
404
  def action_update_respond_to_json
387
- render :json => successful? ? '' : response_object, :only => list_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(list_columns_names), :methods => virtual_columns(list_columns_names), :status => response_status
405
+ response_to_api(:json, list_columns_names)
388
406
  end
389
407
 
390
408
  def objects_for_etag
@@ -410,7 +428,9 @@ module ActiveScaffold::Actions
410
428
  end
411
429
 
412
430
  def virtual_columns(columns)
413
- columns.reject { |col| active_scaffold_config.model.columns_hash[col.to_s] || active_scaffold_config.columns[col]&.association }
431
+ columns.reject do |col|
432
+ active_scaffold_config._columns_hash[col.to_s] || active_scaffold_config.columns[col]&.association
433
+ end
414
434
  end
415
435
 
416
436
  def association_columns(columns)
@@ -424,14 +444,22 @@ module ActiveScaffold::Actions
424
444
  respond_to do |type|
425
445
  action_formats.each do |format|
426
446
  type.send(format) do
427
- if respond_to?(method_name = "#{action}_respond_to_#{format}", true)
428
- send(method_name)
429
- end
447
+ method_name = respond_method_for(action, format)
448
+ send(method_name) if method_name
430
449
  end
431
450
  end
432
451
  end
433
452
  end
434
453
 
454
+ def respond_method_for(action, format)
455
+ if format == :html && params[:iframe] == 'true'
456
+ method_name = "#{action}_respond_on_iframe"
457
+ return method_name if respond_to?(method_name, true)
458
+ end
459
+ method_name = "#{action}_respond_to_#{format}"
460
+ method_name if respond_to?(method_name, true)
461
+ end
462
+
435
463
  def action_formats
436
464
  @action_formats ||=
437
465
  if respond_to? "#{action_name}_formats", true
@@ -32,47 +32,47 @@ module ActiveScaffold::Actions
32
32
  render(:partial => 'create_form')
33
33
  end
34
34
 
35
+ def create_respond_on_iframe
36
+ do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
37
+ responds_to_parent do
38
+ render :action => 'on_create', :formats => [:js], :layout => false
39
+ end
40
+ end
41
+
35
42
  def create_respond_to_html
36
- if params[:iframe] == 'true' # was this an iframe post ?
37
- do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
38
- responds_to_parent do
39
- render :action => 'on_create', :formats => [:js], :layout => false
40
- end
41
- else
42
- if successful?
43
- flash[:info] = as_(:created_model, :model => ERB::Util.h(@record.to_label))
44
- if (action = active_scaffold_config.create.action_after_create)
45
- redirect_to params_for(:action => action, :id => @record.to_param)
46
- elsif params[:dont_close]
47
- redirect_to params_for(:action => 'new')
48
- else
49
- return_to_main
50
- end
43
+ if successful?
44
+ flash[:info] = as_(:created_model, :model => ERB::Util.h(@record.to_label))
45
+ if (action = active_scaffold_config.create.action_after_create)
46
+ redirect_to params_for(:action => action, :id => @record.to_param)
47
+ elsif params[:dont_close]
48
+ redirect_to params_for(:action => 'new')
51
49
  else
52
- if active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.always_show_create
53
- list
54
- else
55
- render(:action => 'create')
56
- end
50
+ return_to_main
57
51
  end
52
+ elsif active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.always_show_create
53
+ list
54
+ else
55
+ render(:action => 'create')
58
56
  end
59
57
  end
60
58
 
61
59
  def create_respond_to_js
62
- do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
63
- if successful? && params[:dont_close] && !render_parent?
64
- @saved_record = @record
65
- do_new
60
+ if successful? && !render_parent?
61
+ do_refresh_list if active_scaffold_config.create.refresh_list
62
+ if params[:dont_close]
63
+ @saved_record = @record
64
+ do_new
65
+ end
66
66
  end
67
67
  render :action => 'on_create'
68
68
  end
69
69
 
70
70
  def create_respond_to_xml
71
- render :xml => response_object, :only => create_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(create_columns_names), :methods => virtual_columns(create_columns_names), :status => response_status, :location => response_location
71
+ response_to_api(:xml, create_columns_names, location: response_location)
72
72
  end
73
73
 
74
74
  def create_respond_to_json
75
- render :json => response_object, :only => create_columns_names + [active_scaffold_config.model.primary_key], :include => association_columns(create_columns_names), :methods => virtual_columns(create_columns_names), :status => response_status, :location => response_location
75
+ response_to_api(:json, create_columns_names, location: response_location)
76
76
  end
77
77
 
78
78
  def create_columns_names
@@ -136,7 +136,7 @@ module ActiveScaffold::Actions
136
136
  private
137
137
 
138
138
  def create_authorized_filter
139
- link = active_scaffold_config.create.link || active_scaffold_config.create.class.link
139
+ link = active_scaffold_config.create.link || self.class.active_scaffold_config.create.class.link
140
140
  raise ActiveScaffold::ActionNotAllowed unless send(link.security_method)
141
141
  end
142
142