Class: TurboCrud::Generators::FullScaffoldGenerator

Inherits:
Rails::Generators::NamedBase
  • Object
show all
Defined in:
lib/generators/turbo_crud/full_scaffold_generator.rb

Constant Summary collapse

VALID_CONTAINERS =
%w[modal drawer both].freeze

Instance Method Summary collapse

Instance Method Details

#generate_add_columns_migrationObject



115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 115

def generate_add_columns_migration
  if attributes.empty?
    say_status :identical, "model exists and no attributes provided; skipping migration generation", :blue
    return
  end

  migration_suffix = attributes.map(&:name).join("_and_")
  migration_name = "add_#{migration_suffix}_to_#{plural_name}"

  say_status :invoke, "rails g migration #{migration_name} ...", :green
  invoke "active_record:migration", [migration_name] + generator_attribute_args
end

#generate_modelObject



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 54

def generate_model
  return if options[:skip_model]

  if model_file_exists?
    generate_add_columns_migration
  else
    say_status :invoke, "rails g model #{class_name} #{generator_attribute_args.join(' ')}", :green
    # Invoke the Rails model generator.
    invoke "active_record:model", [class_name] + generator_attribute_args
  end
end

#generate_turbo_crud_scaffoldObject



95
96
97
98
99
100
101
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 95

def generate_turbo_crud_scaffold
  say_status :invoke, "rails g turbo_crud:scaffold #{class_name} ...", :green

  # Invoke our own scaffold generator (the one that makes controller/views)
  invoke "turbo_crud:scaffold", [class_name] + attributes.map { |a| a.type ? "#{a.name}:#{a.type}" : a.name },
         container: options[:container]
end

#generator_attribute_argsObject



128
129
130
131
132
133
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 128

def generator_attribute_args
  attributes.map do |attr|
    type = (attr.type || :string).to_s
    "#{attr.name}:#{type}"
  end
end

#inject_routesObject



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 66

def inject_routes
  return if options[:skip_routes]

  route_line = "resources :#{plural_name}"
  routes_path = File.join(destination_root, "config/routes.rb")

  unless File.exist?(routes_path)
    say_status :warning, "config/routes.rb not found. Skipping routes injection.", :yellow
    return
  end

  routes_content = File.read(routes_path)

  if routes_content.include?(route_line)
    say_status :identical, "routes already include #{route_line}", :blue
    return
  end

  # Put routes near the top of the draw block.
  # If we can't find it, we just append at the end.
  if routes_content.match?(/Rails\.application\.routes\.draw do\n/m)
    inject_into_file "config/routes.rb", "  #{route_line}\n", after: "Rails.application.routes.draw do\n"
    say_status :insert, "added #{route_line} to routes.rb", :green
  else
    append_to_file "config/routes.rb", "\n#{route_line}\n"
    say_status :append, "appended #{route_line} to routes.rb", :green
  end
end

#model_file_exists?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 111

def model_file_exists?
  File.exist?(File.join(destination_root, "app/models/#{file_name}.rb"))
end

#run_migrationsObject



103
104
105
106
107
108
109
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 103

def run_migrations
  return if options[:skip_model]
  return unless options[:migrate]

  say_status :invoke, "bin/rails db:migrate", :green
  rails_command "db:migrate"
end

#validate_options!Object

Raises:

  • (Thor::Error)


46
47
48
49
50
51
52
# File 'lib/generators/turbo_crud/full_scaffold_generator.rb', line 46

def validate_options!
  normalized = options[:container].to_s.strip.downcase
  return if VALID_CONTAINERS.include?(normalized)

  raise Thor::Error,
        "Invalid --container=#{options[:container].inspect}. Expected one of: #{VALID_CONTAINERS.join(', ')}."
end