ルーティングと名前空間を試しています。
<%= 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
モデルオプションで設定可能なルートの一例です。
お役に立てば幸いです!幸運を!