Если вы хотите, чтобы пользователь мог создавать несколько тегов одновременно, вы можете просто добавить переключатель / флажок к формам для сообщения.
<%= form_for(@post) do |f| %>
# ...
<div class="field">
<%= f.label :product_ids %>
<%= f.collection_select :product_ids, Product.all, :name, :id %>
</div>
<% end %>
def post_params
params.require(:post)
.permit(:foo, :bar, product_ids: [])
end
Rails автоматически создаст записи в таблице соединений.
Если вы хотите, чтобы пользователь создавал связи по одной, вам нужно настроить вложенный маршрут :
Rails.application.routes.draw do
# ...
resources :posts do
resources :taggings, only: :create
end
end
Затем вам нужно настроить форму для каждого продукта на странице posts/show.html.erb
:
<ul>
<% @post.products.each do |product| %>
<li>
<%= product.name %>
<%= form_for [@post, product.taggings.new] do |f| %>
<%= f.hidden_field :product_id %>
<%= f.submit 'tag' %>
<% end %>
</li>
<% end %>
</ul>
Вы можете сделать это позже с помощью CSS / JS.
И контроллер для создания тегов.
class TaggingsController < ApplicationController
# POST /posts/:post_id/taggings
def create
@post = Post.find(params[:post_id])
@tagging = @post.taggings.new(product: Product.find(params[:tagging][:product_id]))
if @tagging.save
redirect_to @product, success: 'Tagging saved.'
else
redirect_to @product, error: 'Tagging not saved.'
end
end
end