active_scaffold 3.6.0.pre → 3.6.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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