bullet-train-co / bullet_train

The Open Source Ruby on Rails SaaS Template
MIT License
1.64k stars 258 forks source link

Super scaffolded routing fails for pretty standard nested, namespaces resources. #1655

Open andrewculver opened 1 month ago

andrewculver commented 1 month ago

When super scaffolding the following resources:

bin/rails generate super_scaffold Task Team name:text_field
bin/rails generate super_scaffold Project Team name:text_field
bin/rails generate super_scaffold Projects::Milestone Project,Team name:text_field
bin/rails generate super_scaffold Projects::Milestones::IncludedTask Projects::Milestone,Project,Team task_id:super_select{class_name=Task} details:text_field --sortable

We produce the following error when trying to show a Projects::Milestone at http://localhost:3000/account/projects/milestones/:id:

undefined method `new_account_projects_milestone_included_task_path' for an instance of #<Class:0x00000001394b2f00>

This is because the routes weren't properly generated for this combination of namespacing and nesting.

Super scaffolding currently produces:

resources :tasks

resources :projects do
  scope module: 'projects' do
    resources :milestones, only: collection_actions do
      # ⚠️ This is in the wrong place!
      scope module: 'milestones' do
        resources :included_tasks, only: collection_actions, concerns: [:sortable]
      end
    end

    namespace :milestones do
      resources :included_tasks, except: collection_actions, concerns: [:sortable]
    end
  end
end

namespace :projects do
  resources :milestones, except: collection_actions
end

But it should have produced:

resources :tasks

resources :projects do
  scope module: 'projects' do
    resources :milestones, only: collection_actions

    namespace :milestones do
      resources :included_tasks, except: collection_actions, concerns: [:sortable]
    end
  end
end

namespace :projects do
  resources :milestones, except: collection_actions do 
    # ✅ This is the right place to put this!
    scope module: 'milestones' do
      resources :included_tasks, only: collection_actions, concerns: [:sortable]
    end
  end
end
andrewculver commented 1 month ago

Looking at https://github.com/bullet-train-co/bullet_train/blob/main/test/system/super_scaffolding/super_scaffolding_test.rb, it looks like we don't have a test for this scenario so it makes sense that it's either always been broken or has been broken by refactors.