измените это значение
<%= form_with model: @brand, local: true do |form| %>
на
<%= form_with(model: @product, url: [@brand, @product]) %>
Также добавьте
@brand = Brand.find(a_brand_id)
в ваш new
метод ProductsController
класс. Итак, rails узнает, какой бренд является родителем этого продукта.
ОБНОВЛЕНИЕ
Я создал фиктивный проект, который будет работать так, как вы ожидали.
products / _form. html .erb частично для продукта
<%= form_with(model: product, local: true) do |form| %>
<% if product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% product.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :title %>
<%= form.text_field :title %>
</div>
<div class="field">
<%= form.label :title, "Select a Brand" %><br>
<%= form.collection_select(:brand_id, Brand.all, :id, :title, {selected: @brand.id}) %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
rout.rb
Rails.application.routes.draw do
resources :products
resources :brands
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
products_controller.rb
class ProductsController < ApplicationController
# GET /products/new
def new
if params[:brand_id]
@brand = Brand.find(params[:brand_id])
end
@product = Product.new
end
def edit
@brand = @product.brand
end
...
# Never trust parameters from the scary internet, only allow the white list through.
def product_params
params.require(:product).permit(:title, :brand_id)
end
end
Я также добавил ссылку для создания продукта для данной марки
брендов / шоу. html .erb
<p id="notice"><%= notice %></p>
<p>
<strong>Title:</strong>
<%= @brand.title %>
</p>
<%= link_to 'Edit', edit_brand_path(@brand) %> |
<%= link_to 'Back', brands_path %> |
<%= link_to 'Create Products', new_product_path(brand_id: @brand.id) %>