Chris Born

Joined

50 Experience
0 Lessons Completed
0 Questions Solved

Activity

I'm having an issue with sharing a the new and edit form for a shallow nested resource in a module/namespace.

Most everything works as expected. The issue I'm running into is using form_with and the model: argument.

<%= form_with model: [:admin, @account, @invoice], local: true do |f| %>
...
<% end %>

The form on the #edit route generates the correct path when @invoice is set and @account is set with @account = @invoice.account

However, the same form used from #new is generating admin_accounting_account_accounting_invoices_path instead of the expected admin_accounting_account_invoices_path. If @account is nil at this point then it generates admin_accounting_schedules_path, however if I actually set @account to the current account of /admin/accounting/accounts/3/new then it generates admin_accounting_account_accounting_invoices_path

Is this a limitation of form_with model: around modularized models in namespaces?

I know I can override with url and duplicate the form in new.html.erb and edit.html.erb but it seems the I may be missing something as this isn't that far from Rails conventions.

# routes.rb
namespace :admin
  namespace :accounting do
    resources :accounts, only: [:index, :show] do
      resources :invoices, shallow: true
    end
  end
end

The models are in an Accounting module as are the controllers:

# => app/models/accounting/accounts.rb
# => app/models/accounting/invoices.rb

# => app/controllers/admin/accounting/accounts.rb
# => app/controllers/admin/accounting/invoices.rb

These are the relevant paths generated from routes:

admin_accounting_accounts_path
admin_accounting_account_invoices_path      GET     /admin/accounting/accounts/:account_id/invoices(.:format)       admin/accounting/invoices#index
                                            POST    /admin/accounting/accounts/:account_id/invoices(.:format)       admin/accounting/invoices#create
new_admin_accounting_account_invoice_path   GET     /admin/accounting/accounts/:account_id/schedules/new(.:format)  admin/accounting/schedules#new
edit_admin_accounting_account_invoice_path  GET     /admin/accounting/invoices/:id/edit(.:format)                   admin/accounting/schedules#edit
admin_accounting_invoice_path               GET     /admin/accounting/invoices/:id(.:format)                        admin/accounting/invoices#show
                                            PATCH   /admin/accounting/invoices/:id(.:format)                        admin/accounting/invoices#update