form_with が間違ったパスでアクションを生成しようとしています

概要

ルーティングと名前空間を試しています。

<%= form_with モデルを使用してフォームを実装する場合: [@user, @address] は |form| を実行します。 %> 未定義メソッド「customer_user_customer_addresses_path」というエラーが表示されます

これはルーティングスキーマです

  namespace :customer do
    resources :users do
      resource :contact
      resources :addresses
    end
  end

  resolve('Customer::Contact') {
    [:customer, :user, :contact]
  }

Rails Routes コマンドによって出力されるすべてのルートは期待どおりです。

                 customer_user_addresses GET    /customer/users/:user_id/addresses(.:format)                                                      customer/addresses#index
                                         POST   /customer/users/:user_id/addresses(.:format)                                                      customer/addresses#create
               new_customer_user_address GET    /customer/users/:user_id/addresses/new(.:format)                                                  customer/addresses#new
              edit_customer_user_address GET    /customer/users/:user_id/addresses/:id/edit(.:format)                                             customer/addresses#edit
                   customer_user_address GET    /customer/users/:user_id/addresses/:id(.:format)                                                  customer/addresses#show
                                         PATCH  /customer/users/:user_id/addresses/:id(.:format)                                                  customer/addresses#update
                                         PUT    /customer/users/:user_id/addresses/:id(.:format)                                                  customer/addresses#update
                                         DELETE /customer/users/:user_id/addresses/:id(.:format)                                                  customer/addresses#destroy
  resolve('Customer::Contact') {
    [:customer, :user, :contact]
  }

Customer::AddressesController を実装するとき、正しいパスを要求する form_with を作成する方法がわかりません。

これがコントローラーのアクションです

  def new
    @breadcrumbs = []
    @user = Customer::User.find(params[:user_id])
    @address = @user.addresses.build
  end

これが新しいテンプレートです

<%= form_with model: [@user, @address] do |form| %>

新しいアクションに移動すると、未定義のメソッド「customer_user_customer_addresses_path」というエラーが表示されます

それを機能させるには、正しいパスを持つ URL パラメーターを渡す必要がありました: <%= form_with model: [@user, @address], url: customer_user_addresses_path(@user) do |form| %>。

どのような規則が欠けているのでしょうか? URLパラメータを省略する方法はありますか?

リポジトリ: https://github.com/LuigiDeCosmis/GestionaleTest

確認するテンプレートは customer/addresses/new.html.erb にあります

解決策

customer_ プレフィックスはどこから来たのでしょうか?

エラーメッセージにはユーザーとアドレスの両方に customer_ プレフィックスが表示されます

undefined method 'customer_user_customer_addresses_path'

ユーザー / アドレス モデルの両方が Customer 名前空間に配置されている間、モデルに基づいてパスを構築しようとしているためです。

具体的に言うと、customer_ プレフィックスはここから来ています:

Customer::User.model_name.param_key
# => "customer_user"
Customer::Address.model_name.param_key
# => "customer_address"

これはそれを解析しようとする方法です: https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/rails/rails/blob/af773ae44a1ae465cc0d19b1e8bf3fc731221ef0/actionview/lib/action_view/helpers/form_helper.rb#L756

どのような規則が欠けているのでしょうか?

モデルにそのように名前空間を付ける必要がある理由がわかりません。

ユーザーを顧客/管理者、またはその他のいずれかにしたい場合は、STI アプローチを使用する必要があります。

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://medium.com/nyc-ruby-on-rails/single-table-inheritance-sti-ruby-on-rails-basics-2a08c81e50af

URLパラメータを省略する方法はありますか?

はい。モデルの Customer 名前空間を削除すると、ルート内に次のようなものが表示されるようになります。

customer_user_addresses

モデルオプションで設定可能なルートの一例です。

お役に立てば幸いです!幸運を!