diff --git a/lib/generators/administrate/dashboard/dashboard_generator.rb b/lib/generators/administrate/dashboard/dashboard_generator.rb index 0a048d7d77152e2bd2632f35dc88ebece98a54b6..71e80fc57217690b428d94907094bc44c2d528a3 100644 --- a/lib/generators/administrate/dashboard/dashboard_generator.rb +++ b/lib/generators/administrate/dashboard/dashboard_generator.rb @@ -31,13 +31,13 @@ module Administrate def create_dashboard_definition template( "dashboard.rb.erb", - Rails.root.join("app/dashboards/#{file_name}_dashboard.rb"), + Rails.root.join("app/dashboards#{class_path_filename_fragment}/#{file_name}_dashboard.rb"), ) end def create_resource_controller destination = Rails.root.join( - "app/controllers/#{namespace}/#{file_name.pluralize}_controller.rb", + "app/controllers/#{namespace}#{class_path_filename_fragment}/#{file_name.pluralize}_controller.rb", ) template("controller.rb.erb", destination) @@ -117,6 +117,12 @@ module Administrate @klass ||= Object.const_get(class_name) end + def class_path_filename_fragment + if @class_path.present? + "/#{@class_path.join("/")}" + end + end + def relationship_options_string(relationship) if relationship.class_name != relationship.name.to_s.classify options_string(class_name: relationship.class_name) diff --git a/lib/generators/administrate/routes/routes_generator.rb b/lib/generators/administrate/routes/routes_generator.rb index c416598e43f853a622e5d84cf1723136e65ad33b..d86301fc1ae9967e0351e3f174c6111c5c277a27 100644 --- a/lib/generators/administrate/routes/routes_generator.rb +++ b/lib/generators/administrate/routes/routes_generator.rb @@ -15,11 +15,6 @@ module Administrate end def warn_about_invalid_models - namespaced_models.each do |invalid_model| - puts "WARNING: Unable to generate a dashboard for #{invalid_model}." - puts " Administrate does not yet support namespaced models." - end - models_without_tables.each do |invalid_model| puts "WARNING: Unable to generate a dashboard for #{invalid_model}." puts " It is not connected to a database table." @@ -52,7 +47,7 @@ module Administrate end def invalid_database_models - models_without_tables + namespaced_models + unnamed_constants + models_without_tables + unnamed_constants end def models_without_tables @@ -63,6 +58,23 @@ module Administrate database_models.select { |model| model.to_s.include?("::") } end + def generate_resource_routes(resource) + if resource.include?("/") + parts = resource.split("/") + generate_nested_resource_routes(parts, 0) + else + "resources :#{resource}" + end + end + + def generate_nested_resource_routes(items, index) + if index == items.size - 1 + "resources :#{items[index]}" + else + "namespace :#{items[index]} do\n#{' '*((index+2)*2)}#{ generate_nested_resource_routes(items,index+1) }\n#{' '*((index+1)*2)}end" + end + end + def unnamed_constants ActiveRecord::Base.descendants.reject { |d| d.name == d.to_s } end diff --git a/lib/generators/administrate/routes/templates/routes.rb.erb b/lib/generators/administrate/routes/templates/routes.rb.erb index 4d86182395e31386c5c77eaed6ab756ad1d1d10d..5ac661c4059996204f4793d93827a2701e726a78 100644 --- a/lib/generators/administrate/routes/templates/routes.rb.erb +++ b/lib/generators/administrate/routes/templates/routes.rb.erb @@ -1,5 +1,5 @@ namespace :<%= namespace %> do -<% dashboard_resources.each do |resource| %> resources :<%= resource %> -<%end%> - root to: "<%= dashboard_resources.first %>#index" - end + <% dashboard_resources.each do |resource| %><%= generate_resource_routes(resource) %> + <%end%> + root to: "<%= dashboard_resources.first %>#index" +end diff --git a/spec/generators/routes_generator_spec.rb b/spec/generators/routes_generator_spec.rb index 8e5d71fca14503e8ab95f828a11f2946b889c40f..fd69b58950309fc133564c682e867f19d75376b8 100644 --- a/spec/generators/routes_generator_spec.rb +++ b/spec/generators/routes_generator_spec.rb @@ -36,18 +36,11 @@ describe Administrate::Generators::RoutesGenerator, :generator do expect(routes).not_to contain("namespace :admin") end - it "skips namespaced models with a warning" do + it "generates routes for namespaced models" do routes = file("config/routes.rb") - - output = run_generator - - expect(routes).not_to contain("blog") - expect(routes).not_to contain("post") - - expect(output).to include <<-MSG.strip_heredoc - WARNING: Unable to generate a dashboard for Blog::Post. - Administrate does not yet support namespaced models. - MSG + run_generator + expect(routes).to contain("blog") + expect(routes).to contain("post") end it "skips models that aren't backed by the database with a warning" do @@ -104,6 +97,6 @@ describe Administrate::Generators::RoutesGenerator, :generator do run_generator - expect(routes).to contain('root to: "customers#index') + expect(routes).to contain('root to: "application#show"') end end