bullet_train-super_scaffolding 1.2.10 → 1.2.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a6b8531f537d4602893ec912e8b2a5d4c0098418d247273d0bd3b06f6bc6b52
4
- data.tar.gz: 2df15d02e422183c0ff5120e886081cde75396ec444fce92c5ec3e0c28c20f81
3
+ metadata.gz: a298ab4bf4e4ef34b72728d13025076979ce8a53ed014b12c88103922b724b42
4
+ data.tar.gz: 673d9792c5134c97faff3625581e39d2250a703ccfab7b21ad28d004f0790350
5
5
  SHA512:
6
- metadata.gz: fe62bc608b0af044613a6a6d6ef2653f8143a76ef3f0e261df8d77ccdc98460f78349267624791c261b8c9be0b223c75e53179e189b7c4343b821bc0c5719cf6
7
- data.tar.gz: 1191a1288797016d937ba7d8af3a466dda7050545d65a3bc3b58ebf28eca98792554f65280ea94f8e30d559cd478bd215beb0c7f307ec3ab66241e874fc9b532
6
+ metadata.gz: 26045ef5529ee5792c835ad924bb029782d13338ddfc1b2f40f350595e7d9099a0dca2a5f21f62944eda315c236a73ffda53bf1f67d13f8fbc1b80f23f4f50ba
7
+ data.tar.gz: b9c3c2e11675220b19e0104fcfc5345dad1f21f6efb3affd90247b335a04d17995b1d4cf8ee0ef6b5ba76e79ec3a088a372c50e910607ae98bbbd69786194eb3
@@ -26,7 +26,7 @@ class Account::Scaffolding::CompletelyConcrete::TangibleThingsController < Accou
26
26
  def create
27
27
  respond_to do |format|
28
28
  if @tangible_thing.save
29
- format.html { redirect_to [:account, @absolutely_abstract_creative_concept, :completely_concrete_tangible_things], notice: I18n.t("scaffolding/completely_concrete/tangible_things.notifications.created") }
29
+ format.html { redirect_to [:account, @tangible_thing], notice: I18n.t("scaffolding/completely_concrete/tangible_things.notifications.created") }
30
30
  format.json { render :show, status: :created, location: [:account, @tangible_thing] }
31
31
  else
32
32
  format.html { render :new, status: :unprocessable_entity }
@@ -1,5 +1,5 @@
1
1
  module BulletTrain
2
2
  module SuperScaffolding
3
- VERSION = "1.2.10"
3
+ VERSION = "1.2.12"
4
4
  end
5
5
  end
@@ -214,7 +214,7 @@ module Scaffolding
214
214
  # If we're shifting a block to the left, we want to safeguard
215
215
  # the String so it doesn't delete any excess characters.
216
216
  if direction == :left
217
- amount.times { line = line.gsub(/^\s/, "") }
217
+ amount.times { line = line.gsub(/^ /, "") }
218
218
  elsif direction == :right
219
219
  line = "\s" * amount + line
220
220
  end
@@ -3,7 +3,7 @@ require "scaffolding/block_manipulator"
3
3
  # TODO: If we move this and the BlockManipulator into their own gems,
4
4
  # we can probably call these methods with something shorter without `Scaffolding::`.
5
5
  module Scaffolding::FileManipulator
6
- def self.find(lines, needle, within = nil)
6
+ def self.find(lines, needle, within = 0)
7
7
  lines_within(lines, within).each_with_index do |line, line_number|
8
8
  return (within + (within ? 1 : 0) + line_number) if line.match?(needle)
9
9
  end
@@ -15,11 +15,6 @@ module Scaffolding::FileManipulator
15
15
  lines[(within + 1)..(Scaffolding::BlockManipulator.find_block_end(starting_from: within, lines: lines) + 1)]
16
16
  end
17
17
 
18
- # TODO I was running into an error in a downstream application where it couldn't find silence_logs? We should implement it in this package.
19
- def self.silence_logs?
20
- ENV["SILENCE_LOGS"].present?
21
- end
22
-
23
18
  def self.replace_line_in_file(file, content, in_place_of, options = {})
24
19
  begin
25
20
  target_file_content = File.read(file)
@@ -10,11 +10,6 @@ def legacy_resolve_template_path(file)
10
10
  end.compact.first || raise("Couldn't find the Super Scaffolding template for `#{file}` in any of the following locations:\n\n#{BulletTrain::SuperScaffolding.template_paths.join("\n")}")
11
11
  end
12
12
 
13
- # TODO I was running into an error in a downstream application where it couldn't find silence_logs? We should implement it in this package.
14
- def silence_logs?
15
- ENV["SILENCE_LOGS"].present?
16
- end
17
-
18
13
  def legacy_replace_in_file(file, before, after)
19
14
  puts "Replacing in '#{file}'." unless silence_logs?
20
15
  target_file_content = File.read(file)
@@ -1,9 +1,10 @@
1
1
  require "scaffolding/block_manipulator"
2
2
 
3
3
  class Scaffolding::RoutesFileManipulator
4
- attr_accessor :child, :parent, :lines, :transformer_options
4
+ attr_accessor :child, :parent, :lines, :transformer_options, :concerns
5
5
 
6
6
  def initialize(filename, child, parent, transformer_options = {})
7
+ @concerns = []
7
8
  self.child = child
8
9
  self.parent = parent
9
10
  @filename = filename
@@ -375,17 +376,34 @@ class Scaffolding::RoutesFileManipulator
375
376
  within = find_or_convert_resource_block(parent_resource, options: "except: collection_actions", within: within)
376
377
  end
377
378
 
378
- find_or_create_resource(child_namespaces + [child_resource], options: define_concerns, within: within)
379
+ add_concern(:sortable) if transformer_options["sortable"]
380
+ find_or_create_resource(child_namespaces + [child_resource], options: formatted_concerns, within: within)
379
381
 
380
382
  end
381
383
  end
382
384
 
383
- # Pushing custom concerns here will add them to the routes file when Super Scaffolding.
384
- def define_concerns
385
- concerns = []
386
- concerns.push(:sortable) if transformer_options["sortable"]
385
+ def add_concern(concern)
386
+ @concerns.push(concern)
387
+ end
388
+
389
+ def formatted_concerns
390
+ return if @concerns.empty?
391
+ "concerns: #{@concerns}"
392
+ end
387
393
 
388
- return if concerns.empty?
389
- "concerns: #{concerns}"
394
+ # Adds a concern to an existing resource at the given line number. (used by the audit logs gem)
395
+ def add_concern_at_line(concern, line_number)
396
+ line = lines[line_number]
397
+ existing_concerns = line.match(/concerns: \[(.*)\]/).to_a[1].to_s.split(",")
398
+ existing_concerns.map! { |e| e.tr(":", "").tr("\"", "").squish&.to_sym }
399
+ existing_concerns.filter! { |e| e.present? }
400
+ existing_concerns << concern
401
+ if line.include?("concerns:")
402
+ lines[line_number].gsub!(/concerns: \[(.*)\]/, "concerns: [#{existing_concerns.map { |e| ":#{e}" }.join(", ")}]")
403
+ elsif line.ends_with?(" do")
404
+ lines[line_number].gsub!(/ do$/, " concerns: [#{existing_concerns.map { |e| ":#{e}" }.join(", ")}] do")
405
+ else
406
+ lines[line_number].gsub!(/resources :(.*)$/, "resources :\\1, concerns: [#{existing_concerns.map { |e| ":#{e}" }.join(", ")}]")
407
+ end
390
408
  end
391
409
  end
@@ -23,6 +23,16 @@ class Scaffolding::Transformer
23
23
  "Team"
24
24
  end
25
25
 
26
+ def top_level_model?
27
+ parent == "Team" || no_parent?
28
+ end
29
+
30
+ # We write an explicit method here so we know we
31
+ # aren't handling `parent` in this situation as `nil`.
32
+ def no_parent?
33
+ parent == "None"
34
+ end
35
+
26
36
  def update_action_models_abstract_class(targets_n)
27
37
  end
28
38
 
@@ -41,7 +51,9 @@ class Scaffolding::Transformer
41
51
  RUBY_NEW_FIELDS_HOOK = "# 🚅 super scaffolding will insert new fields above this line."
42
52
  RUBY_ADDITIONAL_NEW_FIELDS_HOOK = "# 🚅 super scaffolding will also insert new fields above this line."
43
53
  RUBY_EVEN_MORE_NEW_FIELDS_HOOK = "# 🚅 super scaffolding will additionally insert new fields above this line."
54
+ RUBY_NEW_API_VERSION_HOOK = "# 🚅 super scaffolding will insert new api versions above this line."
44
55
  RUBY_FILES_HOOK = "# 🚅 super scaffolding will insert file-related logic above this line."
56
+ RUBY_FACTORY_SETUP_HOOK = "# 🚅 super scaffolding will insert factory setup in place of this line."
45
57
  ERB_NEW_FIELDS_HOOK = "<%#{RUBY_NEW_FIELDS_HOOK} %>"
46
58
  CONCERNS_HOOK = "# 🚅 add concerns above."
47
59
  ATTR_ACCESSORS_HOOK = "# 🚅 add attribute accessors above."
@@ -251,11 +263,6 @@ class Scaffolding::Transformer
251
263
  transformed_file_content.join
252
264
  end
253
265
 
254
- # TODO I was running into an error in a downstream application where it couldn't find silence_logs? We should implement it in this package.
255
- def silence_logs?
256
- ENV["SILENCE_LOGS"].present?
257
- end
258
-
259
266
  def scaffold_file(file, overrides: false)
260
267
  transformed_file_content = get_transformed_file_content(file)
261
268
  transformed_file_name = transform_string(file)
@@ -290,6 +297,9 @@ class Scaffolding::Transformer
290
297
 
291
298
  Dir.foreach(resolve_template_path(directory)) do |file|
292
299
  file = "#{directory}/#{file}"
300
+
301
+ next if file.match?("/_menu_item.html.erb") && !top_level_model?
302
+
293
303
  unless File.directory?(resolve_template_path(file))
294
304
  scaffold_file(file)
295
305
  end
@@ -305,6 +315,9 @@ class Scaffolding::Transformer
305
315
  if override_path
306
316
  Dir.foreach(override_path) do |file|
307
317
  file = "#{directory}_overrides/#{file}"
318
+
319
+ next if file.match?("/_menu_item.html.erb") && !top_level_model?
320
+
308
321
  unless File.directory?(resolve_template_path(file))
309
322
  scaffold_file(file, overrides: true)
310
323
  end
@@ -485,9 +498,20 @@ class Scaffolding::Transformer
485
498
  def add_ability_line_to_roles_yml(class_names = nil)
486
499
  model_names = class_names || [child]
487
500
  role_file = "./config/models/roles.yml"
501
+ roles_hash = YAML.load_file(role_file)
502
+ default_role_placements = [
503
+ [:default, :models],
504
+ [:admin, :models]
505
+ ]
506
+
488
507
  model_names.each do |model_name|
489
- Scaffolding::FileManipulator.add_line_to_yml_file(role_file, "#{model_name}: read", [:default, :models])
490
- Scaffolding::FileManipulator.add_line_to_yml_file(role_file, "#{model_name}: manage", [:admin, :models])
508
+ default_role_placements.each do |role_placement|
509
+ stringified_role_placement = role_placement.map { |placement| placement.to_s }
510
+ if roles_hash.dig(*stringified_role_placement)[model_name].nil?
511
+ role_type = (role_placement.first == :admin) ? "manage" : "read"
512
+ Scaffolding::FileManipulator.add_line_to_yml_file(role_file, "#{model_name}: #{role_type}", role_placement)
513
+ end
514
+ end
491
515
  end
492
516
  end
493
517
 
@@ -571,15 +595,15 @@ class Scaffolding::Transformer
571
595
  def add_has_many_association
572
596
  has_many_line = ["has_many :completely_concrete_tangible_things"]
573
597
 
574
- # TODO I _think_ this is the right way to check for whether we need `class_name` to specify the name of the model.
575
- unless transform_string("completely_concrete_tangible_things").classify == child
598
+ # Specify the class name if the model is namespaced.
599
+ if child.match?("::")
576
600
  has_many_line << "class_name: \"Scaffolding::CompletelyConcrete::TangibleThing\""
577
601
  end
578
602
 
579
603
  has_many_line << "dependent: :destroy"
580
604
 
581
- # TODO I _think_ this is the right way to check for whether we need `foreign_key` to specify the name of the model.
582
- unless transform_string("absolutely_abstract_creative_concept_id") == "#{parent.underscore}_id"
605
+ # Specify the foreign key if the parent is namespaced.
606
+ if parent.match?("::")
583
607
  has_many_line << "foreign_key: :absolutely_abstract_creative_concept_id"
584
608
 
585
609
  # And if we need `foreign_key`, we should also specify `inverse_of`.
@@ -698,6 +722,8 @@ class Scaffolding::Transformer
698
722
  "text"
699
723
  when "text_area"
700
724
  "text"
725
+ when "number_field"
726
+ "number"
701
727
  when "file_field"
702
728
  "file"
703
729
  when "password_field"
@@ -914,7 +940,8 @@ class Scaffolding::Transformer
914
940
  field_content.gsub!(/\s%>/, ", options: { password: true } %>")
915
941
  end
916
942
 
917
- scaffold_add_line_to_file("./app/views/account/scaffolding/completely_concrete/tangible_things/show.html.erb", field_content.strip, ERB_NEW_FIELDS_HOOK, prepend: true)
943
+ show_page_doesnt_exist = child == "User"
944
+ scaffold_add_line_to_file("./app/views/account/scaffolding/completely_concrete/tangible_things/show.html.erb", field_content.strip, ERB_NEW_FIELDS_HOOK, prepend: true, suppress_could_not_find: show_page_doesnt_exist)
918
945
 
919
946
  end
920
947
 
@@ -931,6 +958,20 @@ class Scaffolding::Transformer
931
958
  scaffold_add_line_to_file("./app/views/account/scaffolding/completely_concrete/tangible_things/_index.html.erb", field_content, "<%# 🚅 super scaffolding will insert new field headers above this line. %>", prepend: true)
932
959
  end
933
960
 
961
+ # If these strings are the same, we get duplicate variable names in the _index.html.erb partial,
962
+ # so we account for that here. Run the Super Scaffolding test setup script and check the index partial
963
+ # of models with namespaced parents for reference (i.e. - Objective, Projects::Step).
964
+ transformed_abstract_str = transform_string("absolutely_abstract_creative_concept")
965
+ transformed_concept_str = transform_string("creative_concept")
966
+ transformed_file_name = transform_string("./app/views/account/scaffolding/completely_concrete/tangible_things/_index.html.erb")
967
+ if (transformed_abstract_str == transformed_concept_str) && File.exist?(transformed_file_name)
968
+ replace_in_file(
969
+ transformed_file_name,
970
+ "#{transformed_abstract_str} = @#{transformed_abstract_str} || @#{transformed_concept_str}",
971
+ "#{transformed_abstract_str} = @#{transformed_concept_str}"
972
+ )
973
+ end
974
+
934
975
  table_cell_options = []
935
976
 
936
977
  if first_table_cell
@@ -1393,8 +1434,21 @@ class Scaffolding::Transformer
1393
1434
  add_ability_line_to_roles_yml
1394
1435
  end
1395
1436
 
1437
+ # Add factory setup in API controller test.
1396
1438
  unless cli_options["skip-api"]
1397
- scaffold_replace_line_in_file("./test/controllers/api/v1/scaffolding/completely_concrete/tangible_things_controller_test.rb", build_factory_setup.join("\n"), "# 🚅 super scaffolding will insert factory setup in place of this line.")
1439
+ test_name = transform_string("./test/controllers/api/v1/scaffolding/completely_concrete/tangible_things_controller_test.rb")
1440
+ test_lines = File.open(test_name).readlines
1441
+
1442
+ # Shift contents of controller test after skipping `unless scaffolding_things_disabled?` block.
1443
+ class_block_index = Scaffolding::FileManipulator.find(test_lines, "class #{transform_string("Api::V1::Scaffolding::CompletelyConcrete::TangibleThingsControllerTest")}")
1444
+ new_lines = Scaffolding::BlockManipulator.shift_block(lines: test_lines, block_start: test_lines[class_block_index], shift_contents_only: true)
1445
+ Scaffolding::FileManipulator.write(test_name, new_lines)
1446
+
1447
+ # Ensure variables built with factories are indented properly.
1448
+ factory_hook_index = Scaffolding::FileManipulator.find(new_lines, RUBY_FACTORY_SETUP_HOOK)
1449
+ factory_hook_indentation = Scaffolding::BlockManipulator.indentation_of(factory_hook_index, new_lines)
1450
+ indented_factory_lines = build_factory_setup.map { |line| "#{factory_hook_indentation}#{line}\n" }
1451
+ scaffold_replace_line_in_file(test_name, indented_factory_lines.join, new_lines[factory_hook_index])
1398
1452
  end
1399
1453
 
1400
1454
  # add children to the show page of their parent.
@@ -1490,7 +1544,7 @@ class Scaffolding::Transformer
1490
1544
  collection_actions = [:index, :new, :create]
1491
1545
 
1492
1546
  # 🚅 Don't remove this block, it will break Super Scaffolding.
1493
- begin do
1547
+ begin
1494
1548
  namespace :#{routes_namespace} do
1495
1549
  shallow do
1496
1550
  resources :teams do
@@ -1505,11 +1559,35 @@ class Scaffolding::Transformer
1505
1559
 
1506
1560
  begin
1507
1561
  routes_manipulator.apply([routes_namespace])
1508
- Scaffolding::FileManipulator.write("config/routes.rb", routes_manipulator.lines)
1562
+ Scaffolding::FileManipulator.write(routes_path, routes_manipulator.lines)
1509
1563
  rescue => _
1510
1564
  add_additional_step :red, "We weren't able to automatically add your `#{routes_namespace}` routes for you. In theory this should be very rare, so if you could reach out on Slack, you could probably provide context that will help us fix whatever the problem was. In the meantime, to add the routes manually, we've got a guide at https://blog.bullettrain.co/nested-namespaced-rails-routing-examples/ ."
1511
1565
  end
1512
1566
 
1567
+ # If we're using a custom namespace, we have to make sure the newly
1568
+ # scaffolded routes are drawn in the `config/routes.rb` and API routes files.
1569
+ if cli_options["namespace"]
1570
+ draw_line = "draw \"#{routes_namespace}\""
1571
+
1572
+ [
1573
+ "config/routes.rb",
1574
+ "config/routes/api/#{BulletTrain::Api.current_version}.rb"
1575
+ ].each do |routes_file|
1576
+ original_lines = File.readlines(routes_file)
1577
+
1578
+ # Define which line we want to place the draw line under in the original routes files.
1579
+ insert_line = if routes_file.match?("api")
1580
+ draw_line = " #{draw_line}" # Add necessary indentation.
1581
+ "namespace :v1 do"
1582
+ else
1583
+ "draw \"sidekiq\""
1584
+ end
1585
+
1586
+ new_lines = Scaffolding::BlockManipulator.insert(draw_line, lines: original_lines, within: insert_line)
1587
+ Scaffolding::FileManipulator.write(routes_file, new_lines)
1588
+ end
1589
+ end
1590
+
1513
1591
  unless cli_options["skip-api"]
1514
1592
  begin
1515
1593
  api_routes_manipulator = Scaffolding::RoutesFileManipulator.new("config/routes/api/#{BulletTrain::Api.current_version}.rb", child, parent, cli_options)
@@ -1523,7 +1601,7 @@ class Scaffolding::Transformer
1523
1601
 
1524
1602
  unless cli_options["skip-parent"]
1525
1603
 
1526
- if parent == "Team" || parent == "None"
1604
+ if top_level_model?
1527
1605
  icon_name = nil
1528
1606
  if cli_options["sidebar"].present?
1529
1607
  icon_name = cli_options["sidebar"]
data/lib/scaffolding.rb CHANGED
@@ -16,6 +16,7 @@ module Scaffolding
16
16
  "email_field",
17
17
  "emoji_field",
18
18
  "file_field",
19
+ "number_field",
19
20
  "options",
20
21
  "password_field",
21
22
  "phone_field",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet_train-super_scaffolding
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.10
4
+ version: 1.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Culver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-31 00:00:00.000000000 Z
11
+ date: 2023-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: standard
@@ -101,27 +101,21 @@ files:
101
101
  - app/models/scaffolding/completely_concrete/tangible_things/assignment.rb
102
102
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/_breadcrumbs.html.erb
103
103
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/_creative_concept.html.erb
104
- - app/views/account/scaffolding/absolutely_abstract/creative_concepts/_creative_concept.json.jbuilder
105
104
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/_form.html.erb
106
105
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/_index.html.erb
107
106
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/_menu_item.html.erb
108
107
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/_breadcrumbs.html.erb
109
- - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/_collaborator.json.jbuilder
110
108
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/_form.html.erb
111
109
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/_index.html.erb
112
110
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/_menu_item.html.erb
113
111
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/edit.html.erb
114
112
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/index.html.erb
115
- - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/index.json.jbuilder
116
113
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/new.html.erb
117
114
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/show.html.erb
118
- - app/views/account/scaffolding/absolutely_abstract/creative_concepts/collaborators/show.json.jbuilder
119
115
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/edit.html.erb
120
116
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/index.html.erb
121
- - app/views/account/scaffolding/absolutely_abstract/creative_concepts/index.json.jbuilder
122
117
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/new.html.erb
123
118
  - app/views/account/scaffolding/absolutely_abstract/creative_concepts/show.html.erb
124
- - app/views/account/scaffolding/absolutely_abstract/creative_concepts/show.json.jbuilder
125
119
  - app/views/account/scaffolding/completely_concrete/tangible_things/_breadcrumbs.html.erb
126
120
  - app/views/account/scaffolding/completely_concrete/tangible_things/_form.html.erb
127
121
  - app/views/account/scaffolding/completely_concrete/tangible_things/_index.html.erb
@@ -1,8 +0,0 @@
1
- json.extract! creative_concept,
2
- :id,
3
- :name,
4
- :description,
5
- # 🚅 super scaffolding will insert new fields above this line.
6
- :created_at,
7
- :updated_at
8
- json.url account_scaffolding_absolutely_abstract_creative_concept_url(creative_concept, format: :json)
@@ -1,9 +0,0 @@
1
- json.extract! collaborator,
2
- :id,
3
- :creative_concept_id,
4
- :membership_id,
5
- :roles,
6
- # 🚅 super scaffolding will insert new fields above this line.
7
- :created_at,
8
- :updated_at
9
- json.url account_scaffolding_absolutely_abstract_creative_concepts_collaborator_url(collaborator, format: :json)
@@ -1 +0,0 @@
1
- json.array! @collaborators, partial: "scaffolding/absolutely_abstract/creative_concepts/collaborators/collaborator", as: :collaborator
@@ -1 +0,0 @@
1
- json.partial! "scaffolding/absolutely_abstract/creative_concepts/collaborators/collaborator", collaborator: @collaborator
@@ -1 +0,0 @@
1
- json.array! @creative_concepts, partial: "scaffolding/absolutely_abstract/creative_concepts/creative_concept", as: :creative_concept
@@ -1 +0,0 @@
1
- json.partial! "scaffolding/absolutely_abstract/creative_concepts/creative_concept", creative_concept: @creative_concept